计算机网络 -面向连接的运输:TCP -运输层

一、TCP连接小知识点

  1. TCP连接前必须得先进行3次握手
  2. TCP是点对点的连接,且只作用在端系统上。
  3. TCP无法进行广播发送。
  4. 在前面的文章中有提到TCP的发送方需要先发送一个敲门分组给接收方(这是一次握手),然后接收方再发送一个正式的传送分组给发送方(这是第二次分组),发送方再返回给他第三个报文(可以承载有效负荷。(第三次握手)。
  5. TCP发送方和接收方都需要缓存,发送缓存需要缓存的是上层应用请求发送的套接字。而接收缓存需要缓存的是通过网络传输过来的套接字(这里有累积确认的知识点,后面会讲到)。
  6. **最大报文段长度(MSS)最大传输单元(MTU)**的关系,MSS=MTU-TCP/IP首部长度。其中MSS不包含首部的TCP!!

二、TCP报文结构

图片来源
计算机网络 -面向连接的运输:TCP -运输层

2.1 序号

一个报文段的序号是该报文段首字节的字节流编号。这是说明意思呢,我们来举个栗子。假定数据流由一个包含500000字节的文件组成,其MSS为1000字节,数据流的首字节编号是0,第二个报文段分配的序号是1000,第三个是2000,以此类推。

2.2 确认号

主机A的确认号是主机A期望从主机B收到的下雨字节的序号。
在确认号这里有一个点非常重要,**TCP只确认该数据流中至第一个丢失字节为止的字节。**所以乱序先到达的分组需要在接收方的接收缓存中呆一会。等到前面的分组发上来之后才会一起确认。继续用上个例子进行说明,虽然序号2000已经到达了,但是由于序号1000还未到达,所以接收方对序号2000的回复是ACK 1000。

2.3 往返时间的估计与超时

我们对于每一个发送但未确认的分组有一个倒计时定时器。那我们如何确认这个倒计时的时间呢?

2.3.1 估计往返时间

因为网络的波动会导致往返时间的变化,所以往返时间往往不太一样,往返时间的估计是通过每一个已发送但未确认的分组时间进行统计,将其进行指数加权平均得到平均的往返时间(EstimatedRTT)。但是毕竟是平均的时间,有一些差一点点就传送完毕的被进行了不必要的重传。所以需要引入一个新的DevRTT(用于估计当前往返时间与加权平均时间的差值的加权平均)。
在实际应用中,使用

TimeoutInterval=EstimatedRTT+4DevRTT. TimeoutInterval = EstimatedRTT+4 · DevRTT.
推荐的初始TimeoutInterval为1s,同时,出现超时后,TimeoutInterval将会加倍,一面后续的分组继续超时。但是当分组正确收到就会更新EstimatedRTT,然后就用上式对TimeoutInterval进行计算。