计算机网络协议(3)-传输层

TCP

一,报文结构

  • TCP的包是没有IP地址的,那是IP层上的。但是有源端口和目标端口。
  • Window又叫Advertised-Window,也就是滑动窗口(Sliding Window)
  • TCP Flag ,也就是包的类型,主要是用于操控TCP的状态机的。

    SYN 同步序号
    FIN 发送方完成数据发送
    RST 复位连接
    PSH 尽可能的将数据送往接收进程
    

二,建立与关闭连接


  • 关于建连接时SYN超时
    在Linux下,默认重试次数为5次,重试的间隔时间从1s开始每次都翻售,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s都知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 2^6 -1 = 63s,TCP才会把断开这个连接。

  • TIME_WAIT
    TIME_WAIT状态也称2MSL(报文段最大生存时间)等待状态。
    从TIME_WAIT状态到CLOSED状态,有一个超时设置,这个超时设置是 2*MSL(RFC793定义了MSL为2分钟,Linux设置成了30s)

三,可靠数据传输

1,MSS

最大报文段长度表示TCP传往另一端的最大数据库的长度。当一个连接建立的时候,连接的双发都要告知各自的MSS。

报文段越大允许每个报文段传送的数据就越多,相对IP和TCP首部就有更高的利用率。

2,序号

用来解决网络包乱序(reordering)问题

3,确认号

用来解决不丢包的问题

4,滑动窗口

TCP头里有一个字段叫Window,又叫Advertised-Window,这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。

5,超时重传

根据RTT(Round Trip Time)设置RTO(Retransmission TimeOut)。

6,快速重传

如果发送方连续收到3次相同的ack,就立即重传。

7,Nagle算法

延迟小分组的发送

四,拥塞控制

1,慢启动

  1. 连接建好的开始先初始化cwnd = 1,表明可以传一个MSS大小的数据。
  2. 每当收到一个ACK,cwnd++; 呈线性上升
  3. 每当过了一个RTT,cwnd = cwnd*2; 呈指数让升
  4. 还有一个ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算法”

2,拥塞避免

一般来说ssthresh的值是65535,单位是字节,当cwnd达到这个值时后

  1. 收到一个ACK时,cwnd = cwnd + 1/cwnd
  2. 当每过一个RTT时,cwnd = cwnd + 1

3,快速恢复

3个重复的Ack会进入快速恢复算法,进入Fast Recovery之前,cwnd 和 sshthresh已被更新:

  • cwnd = cwnd /2
  • sshthresh = cwnd

算法描述:

  1. cwnd = sshthresh + 3 * MSS (3的意思是确认有3个数据包被收到了)
  2. 重传Duplicated ACKs指定的数据包
  3. 如果再收到 duplicated Acks,那么cwnd = cwnd +1
  4. 如果收到了新的Ack,那么,cwnd = sshthresh ,然后就进入了拥塞避免的算法了。

UDP

1,报文结构

2,优势

  • 实时发送,由应用程序精确控制发送时间
  • 无需连接建立,发送效率高
  • 无连接状态,连接开销下,可创建更多连接
  • 分组首部开销小,tcp首部20字节,udp只需8字节

参考资料