TCP协议深入了解

目录

IP

运输层的多路复用和多路分解

多路复用

多路分解

TCP协议

TCP首部格式

TCP 的三次握手

TCP 的四次挥手

TCP片段丢失(丢包)

TCP拥塞控制

加性增,乘性减(AIMD)

慢启动

超时重传

快速重传和快速恢复


IP

在谈到传输协议前必须要先理解IP(Internet Protocal,互联网协议)的基本概念。
IP包含两个基本的功能,寻址分片。 两个电话拨通,我们需要知道两个电话之间的电话号码,而主机之间的通讯也一样,每一个连上Internet的主机都至少要有一个IP地址,从而将自己与其他网络上的主机区分开来。

源主机必须要知道目标主机的IP地址才能向其发送数据。源主机可以向已知IP地址的目的主机发送数据包,并借助于网络设备寻找到达目的主机的路径,最终将数据包发送到目的地,这个过程即为寻址

当发送数据时,信息将被拆分为若干个小块,称为数据包。IP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组。 不同的链路类型规定有不同最大长度的链路层数据帧,称为链路层MTU(最大传输单元)。常见以太网的MTU为1500,若IP协议在传输数据包时,IP报文长度大于转发接口的MTU,则将数据报文分为若干分片进行传输,分片报文到达接收方时,由接收方完成重组。
因为数据包可以通过Internet不同的路径到达目的地址,所以数据包到达目的地址的顺序可能与发送时的顺序不同。IP只负责发送数据包,而TCP负责将数据包按照正确的顺序进行排序。

IP数据包的格式

IP的服务模型是尽力而为交付服务,意味着IP尽自己最大的努力交付报文段,但是它并不做任何担保。不确保文段的交付,不能保证文段的顺序正确,因为这些原因,IP被称为不可靠服务。而随着TCP的引入,保证了文段传输的可靠性

运输层的多路复用和多路分解

UDP以及TCP的主要作用:将两个端系统间IP的交付服务扩展为进程之间的交付服务。我们将主机间交付扩展到进程到进程交付,称为运输层的多路复用多路分解。 在应用层与运输层之间有着由软件实现的端口。各进程之间通过套接字,将进程之间交流的信息从自己的端口和目的的端口连接起来。我们可以把主机看作一个房子,而套接字则是门,它相当于从网络向进程传递数据和从进程向网络中传递数据的门户。我们的主机在任何一个时刻,主机上都有多个套接字,而套接字都有可以唯一标识自己的标识符。

多路复用

那么什么叫做多路复用呢,我们将不同的套接字中的数据段收集起来,并且在每一个每一个数据块封装上首部信息(这将在多路分解中使用)从而生成报文段。

这个过程类似于将一个城市的信件放入邮件车中。信件上有一系列的信息,寄信人,收信人等。

多路分解

将运输层报文段中的数据交付到正确的套结字上的工作被称为多路分解。

这个过程类似于邮件车到达了目标城市,然后根据信件上的地址将信件投放到指定的客户手上。这里的客户即是目标套接字。

TCP协议

传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。

TCP首部格式

TCP

  • 序号 :用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。

  • 确认号 :期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。

  • 数据偏移 :指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。

  • 确认 ACK :当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。

  • 同步 SYN :在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。

  • 终止 FIN :用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。

  • 窗口 :窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。

TCP 的三次握手

TCP假设 A 为客户端,B 为服务器端。

  • 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。

  • A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。

  • B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。

  • A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。

  • B 收到 A 的确认后,连接建立。

三次握手的原因

第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。

客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。

TCP 的四次挥手

TCP以下描述不讨论序号和确认号,因为序号和确认号的规则比较简单。并且不讨论 ACK,因为 ACK 在连接建立之后都为 1。

  • A 发送连接释放报文,FIN=1。

  • B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。

  • 当 B 不再需要连接时,发送连接释放报文,FIN=1。

  • A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。

  • B 收到 A 的确认后释放连接。

四次挥手的原因

客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。

TIME_WAIT

客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:

  • 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。

  • 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。

TCP片段丢失(丢包)

接收方(receiver)可以通过校验TCP片段头部中checksum区域来检验TCP片段是否出错。我们已经接触过了IP协议详解的checksum算法。TCP片段的checksum算法与之类似。IP协议的checksum只校验头部,TCP片段头部的checksum会校验包括IP头部、TCP头部和TCP数据在内的整个序列,确保IP地址、端口号和其他相关信息正确。如果TCP片段出错,接收方可以简单的丢弃该TCP片段,也就相当于TCP片段丢失。

TCP片段包裹在一个IP包中传输。IP包可能在网络中丢失。导致IP包丢失的原因可能有很多,比如IP包经过太多的路由器接力,达到hop limit;比如路由器太过拥挤,导致一些IP包被丢弃;再比如路由表(routing table)没有及时更新,导致IP包无法送达目的地。

而产生丢包对于发送方来说,最直观的现象有两种: 
1.超时
2.收到来自接受方的三次冗余ACK 
解决方案也无一例外,也就是重传,不过有一些小小的差别,下面将会提到。

TCP拥塞控制

如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度

为了使TCP拥有拥塞控制机制,于是连接的每一端都记录一个额外的变量,即拥塞窗口(CongWin),它对TCP分组的传输速率进行了限制。一个发送方的中未被确认的量一定不能大于CongWin。

加性增,乘性减(AIMD)

当TCP在传输时发生丢包事件时,在重传的同时,CongWin的大小也发生变化,每次丢包事件都将导致CongWin的大小减半,而后分组每成功传输一次,CongWin的大小加1个MSS(最大报文段长度),所以被称作加性增,乘性减AIMD
由上图可以直观看出CongWin的大小变化。

慢启动

当一个TCP连接开始时,CongWin的大小从一个MSS开始,每过一个RTT就将CongWin的大小翻倍,直到第一个丢包事件发生。
由图,TCP传输从每次一个报文段,慢慢地随着2的指数倍增长。

超时重传


当超时事件发生后,发送方进行重传,而CongWin的大小将会重新便为1,重新进入慢启动状态,直到达到上次丢包时CongWin的一半(这个值TCP通过一个称为阈值的变量来维护),然后开始进入拥塞避免阶段,开始线性增长。

快速重传和快速恢复


当发送方连续收到3次冗余ACK时,即发生丢包事件,进行重传。在以前的TCP版本中,无论是超时还是收到3次冗余ACK都是进行慢启动(TCP Tahoe)。在较新版本的TCP (TCP Reno)中是这样的,CongWin变为原来的一半。取消慢启动的原因在于,在收到3次冗余ACK时其实另外的报文段已经被接受方收到了。因此它与超时事件不同,网络显示它自己可以交付一些报文段,即使其他报文段因为拥塞丢失了。这种收到3次冗余ACK取消慢启动的行为叫做快速恢复。 

猜你喜欢

转载自blog.csdn.net/zhuochuyu7096/article/details/84664152
今日推荐