传输层
职责: 提供网络中两台主机进程间的可靠、不可靠传输服务。
相关协议
TCP协议
特点
- 面向连接(虚连接, 点对点)、字节流(对用户数据包分片)、拥塞控制、可靠交付(误差控制)
首部格式(长度固定, 20 Byte)
- 源端口
- 目的端口
- 序号seq(该分片字节流首字节序号)
- 确认号ack(期望接收的下一分片的序号 = 当前分片序号 + 分片长度)
- 数据偏移: 当前分片中数据部分相对于首部的偏移
- 确认ACK(建立连接后所有报文段ACK都要置为1)
- 同步SYN(建立连接时用于同步序号)
+ 请求报文段: SYN=1, ACK=0
+ 同意连接响应报文段: SYN=1, ACK=1 - 终止FIN(释放连接请求)
- 窗口大小(接收方规定,要求发送端设置)
三次握手建立连接
第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。四次挥手断开连接
- 四次挥手是为了客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。
- TIME_WAIT
客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间2MSL。这么做有两个理由:- 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。
- 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。
Tcp可靠传输——ACK、校验和(使用伪首部)、超时重传
- 超时重传机制
- 往返时间RTT、超时时间RTO
- RTO略大于RTT
- RTT: 报文段发送 -> 接收 -> 回送确认的时间
Tcp流量控制——滑动窗口(缓存,以字节为单位)
- 窗口大小设置 发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小
- 发送窗口 发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态
- 接收窗口 接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口
Tcp拥塞控制——慢开始、拥塞避免、快重传、快恢复
- 慢开始: 控制发送端一次能够发送的报文数量cwnd以指数增长(1,2,4...)
- 拥塞避免: 当cwnd超过设置的满开始门限ssthresh进入拥塞避免,cwnd每次只能增长1。拥塞避免阶段若出现超时则重新执行慢开始,设置ssthresh为当前cwnd的一半
- 快重传: 当发送端收到接收端3个重复的ACK则立刻对丢失的数据报进行重传
- 快恢复: 快重传后将ssthresh设置为cwnd/2,并直接进入拥塞控制阶段
UDP(用户数据报)协议
- 特点: 无连接(事先不建立连接)、尽最大可能交付(不可靠)、无拥塞控制、面向报文(传输整个用户数据报)
- 首部格式(固定长度,8 Byte)
- 源端口
- 目的端口
- 长度(数据长度)
- 校验和