欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

计算机网络 (V) 传输层 - II.TCP

最编程 2024-04-06 07:53:06
...

1.报文段格式

在这里插入图片描述
TCP的全部功能体现在其首部的各个字段中,各字段意义如下:
1)源端口和目的端口。各占2B。端口是传输层与应用层的服务接口。

2)序号。占4B,范围为0~232-1,共232个序号。TCP是面向字节流的,传送的字节流中的每个字节都按顺序编号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。

3)确认号。占4B,是期望收到对方下一个报文段的第一个数据字节的序号。

4)数据偏移(即首部长度)。占4位,这里不是IP数据报分片的那个数据偏移,而是表示首部长度(首部中还有长度不确定的选项字段),它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。

5)保留。占6位,保留为今后使用,但目前应置为0。

6)紧急位URG。当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送。

7)确认位ACK。仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP 规定,在连接建立后所有传送的报文段都必须把ACK置1。

8)推送位PSH(Push)。接收方TCP收到PSH=1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。

9)复位位RST(Reset)。当RST=1时,表明TCP连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

10)同步位SYN。当SYN=1时表示这是一个连接请求或连接接受报文。当SYN=1,ACK=0时,表明这是一个连接请求报文,对*同意建立连接,则应在响应报文中使用 SYN=1,ACK=1。

11)终止位FIN(Finish)。用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

12)窗口。占2B,范围为0~26-1。它指出现在允许对方发送的数据量,接收方的数据缓存空间是有限的,因此用窗口值作为接收方让发送方设置其发送窗口的依据。

13)校验和。占2B。校验和字段检验的范围包括首部和数据两部分。在计算校验和时,和UDP一样,要在TCP报文段的前面加上12B的伪首部(只需将UDP伪首部的协议字段的 17改成6,UDP长度字段改成TCP 长度,其他的和UDP一样)。

14)紧急指针。占 2B。紧急指针仅在URG=1时才有意义,它指出在本报文段中紧急数据共有多少字节。

15)选项。长度可变。

16)填充。这是为了使整个首部长度是 4B 的整数倍。

2.连接管理

在这里插入图片描述
第一步:客户机的TCP 首先向服务器的TCP发送连接请求报文段。这个特殊报文段的首部中的同步位 SYN 置1,同时选择一个初始序号 seq=x。TCP规定,SYN 报文段不能携带数据,但要消耗掉一个序号。这时,TCP 客户进程进入SYN-SENT(同步已发送)状态。

第二步:服务器的TCP收到连接请求报文段后,如同意建立连接,则向客户机发回确认,并为该TCP连接分配缓存和变量。在确认报文段中,把SYN 位和ACK位都置1,确认号是ack=x+1,同时也为自己选择一个初始序号 seq=y。注意,确认报文段不能携带数据,但也要消耗掉一个序号。这时,TCP服务器进程进入SYNRCVD(同步收到)状态。

第三步:当客户机收到确认报文段后,还要向服务器给出确认,并为该TCP 连接分配缓存和变量。确认报文段的ACK位置1,确认号 ack=y+1,序号 seq=x+1。该报文段可以携带数据,若不携带数据则不消耗序号。这时,TCP 客户进程进入ESTABLISHED(已建立连接)状态。成功进行以上三步后,就建立了TCP 连接,接下来就可以传送应用层数据。TCP提供的是全双工通信,因此通信双方的应用进程在任何时候都能发送数据。另外,值得注意的是,服务器端的资源是在完成第二次握手时分配的,而客户端的资源是在完成第三次握手时分配的,这就使得服务器易于受到SYN 洪泛攻击。

在这里插入图片描述

第一步:客户机打算关闭连接时,向其TCP发送连接释放报文段,并停止发送数据,主动关闭TCP 连接,该报文段的终止位FIN 置1,序号 seq=u,它等于前面已传送过的数据的最后一个字节的序号加1,FIN 报文段即使不携带数据,也消耗掉一个序号。这时,TCP客户进程进入FIN-WAIT1(终止等待1)状态。TCP是全双工的,即可以想象为一条TCP连接上有两条数据通路,发送FIN 的一端不能再发送数据,即关闭了其中一条数据通路,但对方还可以发送数据。

第二步:服务器收到连接释放报文段后即发出确认,确认号ack=u+1,序号seq=v,等于它前面已传送过的数据的最后一个字节的序号加1。然后服务器进入CLOSE-WAIT(关闭等待)状态。此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态。但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭。

第三步:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时,其发出FIN=1的连接释放报文段。设该报文段的序号为w(在半关闭状态服务器可能又发送了一些数据),还须重复上次已发送的确认号 ack=u+1。这时服务器进入LASTACK(最后确认)状态。
第四步:客户机收到连接释放报文段后,必须发出确认。把确认报文段中的确认位ACK置1,确认号ack=w+1,序号 seq=u+1。此时TCP连接还未释放,必须经过时间等待计时器设置的时间2MSL(最长报文段寿命)后,客户机才进入CLOSED(连接关闭)状态。

在这里插入图片描述

3.可靠传输

TCP 使用了校验、序号、确认和重传等机制来达到这一可靠传输的目的。

  • 序号

  TCP首部的序号字段用来保证数据能有序提交给应用层,TCP把数据视为一个无结构但有序的字节流,序号建立在传送的字节流之上,而不建立在报文段之上。
如给每个第一个报文段的数据、第二个、第三个 都编上一个序号。

  • 确认

  TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。发送方缓存区会继续存储那些已发送但未收到确认的报文段,以便在需要时重传
TCP默认使用累积确认,即TCP只确认数据流中至第一个丢失字节为止的字节。

  • 重传

  有两种事件会导致TCP对报文段进行重传:超时和冗余ACK。

  (1)超时
  TCP 每发送一个报文段,就对这个报文段设置一次计时器。计时器设置的重传时间到期但还未收到确认时,就要重传这一报文段。

  (2)冗余ACK(冗余确认)
  超时触发重传存在的一个问题是超时周期往往太长。所幸的是,发送方通常可在超时事件发生之前通过注意所谓的冗余ACK来较好地检测丢包情况。冗余ACK就是再次确认某个报文段的ACK,而发送方先前已经收到过该报文段的确认。

4.流量控制

在这里插入图片描述

5.拥塞控制

在这里插入图片描述
在这里插入图片描述
初始时,拥塞窗口置为1,即cwnd=1,慢开始门限置为16,即 ssthresh=16。

慢开始阶段,cwnd 的初值为1,以后发送方每收到一个确认ACK,cwnd值加1,也即经过每个传输轮次(RTT),cwnd呈指数规律增长。当拥塞窗口cwnd 增长到慢开始门限ssthresh时(即当 cwnd=16 时),就改用拥塞避免算法,cwnd 按线性规律增长。假定cwnd=24时网络出现超时,更新ssthresh值为 12(即变为超时时cwnd值的一半),cwnd重置为1,并执行慢开始算法,当cwnd=12时,改为执行拥塞避免算法。

快重传
当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。

快恢复
在这里插入图片描述