计算机网络 - 传输层(TCP/UDP层)

1、简介

TCP/IP协议中,传输层给应用层提供服务
TCP/IP协议栈中,传输层只包含两个协议:缓存

  • TCP协议:可靠性传输,面向链接,提供差错检测
  • UDP协议:不可靠传输,无链接

  • 通常约定用传输层协议 + 端口号来标识上面应用层使用了什么协议。

  • 数据在网络上传输,经过网络层的IP地址找到目标主机,经过传输层的端口号定位目标主机上的服务(应用程序)。因此传输层为相互通讯的应用进程提供了逻辑通讯网络

  • 端口号:16位,本地惟一便可,只有本地意义。优化

2、UDP协议

主要特色操作系统

  • 无链接,发送以前不须要创建链接,通常一个数据包就能完成的通讯使用UDP。例如,请求CDN解析网址。
  • 最大努力交付。不保证可靠交付,不使用拥塞控制。
  • 面向报文的。适合多媒体通讯的要求。适合于多播通讯。
  • 支持一对1、一对多、多对一和多对多的交互通讯。
  • 首部开销小,只有8字节。

UDP数据报结构3d

  • 伪首部:2个字节。为了计算检验和,取网络层首部的一部分信息参与计算。

3、 TCP协议

TCP协议的特色指针

  • 面向链接
  • 只能是点对点的通讯
  • 提供可靠交付的服务
  • 实现拥塞控制功能
  • 实现流量控制功能
  • 面向字节流传输

流式传输cdn

应用层发送数据是把数据放到了操做系统的TCP发送缓存中。操做系统发送时,去TCP发送缓存中取数据组成TCP数据包。应用层一次发送了8个字节的数据,操做系统第一次从发送缓存取出5个字节发送是能够的。或者应用层分别发送了一个8字节和一个10字节的包,操做系统从缓存中取出18个字节一次发送也是彻底能够的。接收端解析后,把字节流按顺序放入TCP接收缓存,每次从缓存中取必定的字节(跟发送端应用程序一次发送多少个字节没有关系)数递交给应用层。blog

因为应用层一次发送数据的大小和传输层一次递交给接收端应用层的数据的大小不必定彻底同样,因此应用层须要处理TCP粘包问题。进程

套接字(Socket)资源

IP+端口能够表达TCP传输中的一个端点。IP+Port称为套接字。

如何实现可靠传输
(后面我会更新一篇专栏更加详细的阐述可靠性传输的实现)

  • 自动重传协议(ARQ)

    发送端发送一个数据以后等待接收端响应成功接收的确认后,再发送下一个数据包(中止等待协议)。
    必定时间内没有收到确认,发送端重传这个数据包(超时重传),最大等待时间略大于往返时延(RTT)。因此重传是自动进行的。

    若是接收端发送的确认丢失,或者确认迟到即确认没有在最大等待时间内到达发送端,这两种状况也都会致使发送端进行超时重传。这种状况下,接收端会丢弃重复的数据。因此TCP协议还支持去重的功能。

    通俗来讲,ARQ协议就是,只要你没在必定时间内告诉我收到了,我就认为你没收到。

    中止等待协议实现简单,可是信道利用率低。由于发送数据的时间要远小于等待的时间。

  • 流水线传输

上面提到的ARQ传输协议的信道利用率很是低,已经被淘汰。目前TCP协议中采用流水线传输。即发送端发送一个数据包后,不等待接收端的ACK就当即发送下一个准备好的数据包。当一个包发送了时间x以后,还没收到收到这个包的ACK,就会重传这个包。x的取值略大于网络的往返时延TTL。假设在时间x内,能够发送n个数据包,那么发送端必需要缓存n个尚未收到ack的数据包。即发送端维护一个发送窗口。

发送窗口内是发送了尚未收到ACK的数据包,当发送窗口内有数据收到ACK以后,就能够被移出窗口,而且窗口左边沿向前推动。当窗口内的数据大于窗口的最大长度时,就不能继续发送数据了,须要等待ACK或者进行重传。

举个例子,上图中假如滑动窗口的大小是5,此时窗口已经被占满。有两种状况,若是收到了数据包1的ACK那么数据包1被溢出窗口,窗口向前推动继续发送第6个包。若是没收到ACK,会重传数据包1,其实窗口也会向前推动,次数数据包6的内容跟数据包1的内容相同,即数据包1的重传。

累计确认是对上述机制的进一步优化,即接收端若是收到了连续的数据包一、二、3,只须要在ACK里回复收到了3,发送端就能够隐式的知道一、二、3都发送成功了。

TCP报文段格式:

  • 源端口、目标端口:用于标识TCP连接两端进行通讯的两个应用程序。
  • 序号:应用层下发的数据在传输层可能被分段传输。序号指的是。TCP数据包数据部分的第一个字节是应用层下发的数据的第几个字节。
  • 确认号:TCP数据包中数据部分的最后一个字节是应用层下发的数据中的第几个字节再加上1。接收端发送ACK时携带的是这个确认号,实际上接收发送端下一个发送数据的序号。
  • 数据偏移:数据部分起始位置相对于整个数据包的偏移字节数。因为首部有长度可变的部分,因此须要数据偏移。
  • URG:若是为1,优先传输,无论发送缓存中还有多少多少数据在排队。
  • ACK:若是是0,确认号无效,不然有效。
  • SYN:SYN=1,表示是创建会话的控制包。此时发送端序号=0,确认号=0,ACK=0(确认号无效)。接收端序号=0,确认号=1,ACK=1(发送端知道链接创建成功了,能够开始发送第一个数据包了)。
    SYN攻击:利用创建会话的机制进行攻击,给主机发送大量创建链接的请求,请求数据包中填写一个不存在的源IP地址。形成主机一直在等待创建链接。或者目标IP和源IP都填写主机本身的IP,让主机跟本身创建大量的TCP链接。占用大量的主机资源,形成主机不能继续响应正常的链接创建请求。
  • PSH: 若是是1。接收端缓存优先把这个数据包递交给应用层,无论接收缓存里是否还有未向上递交的数据。
  • RST:若是是1,表明异常中断,告诉对端当即断开链接。
  • FIN:若是是1。通讯正常结束,释放链接。
  • 窗口:TCP通讯中,须要告诉对端本身的接收缓存最多能存放多少字节的数据。对端获知后设置本身的发送缓存为一样的大小。在创建链接的SYN数据包中通知对端。
  • 校验和:与上面提到的UDP协议中的校验和的计算方式一致。
  • 紧急指针:URG为1时设置的紧急指针才会生效。指示URG包中前多少个字节是须要紧急处理的。
  • 选择(可变长度):能够用于通知对端本身可以处理的最大的TCP数据报的长度。能够用于通知对端本身是否支持选择性确认。
相关文章
相关标签/搜索