淮南皓月冷千山
冥冥归去无人管
基本功能
运输层也是面试重点,尤其是TCP和UDP。运输层是为进程之间提供逻辑通信的层次,是通信的最高层,用户功能的最低层。
各功能使用的运输层服务:
UDP
特点:
- 无连接
- 尽最大努力交付(不保证可靠)
- 面向报文(保留应用层报文边界)
- 无拥塞控制
- 支持一对一、一对多、多对一、多对多
- 首部开销小(8字节)
- 源端口
- 目的端口
- 长度
- 检验和
TCP
特点:
- 面向连接
- 可靠传输(无差错、不丢失、不重复、按序到达)
- 点对点(一对一通信)
- 全双工通信
- 面向字节流(将应用层报文看作字节序列)
可靠传输的工作原理
- 停止-等待协议
发送完一组,必须等待确认,得到确认之后才能发送下一组,若长时间没有的到确认,则重传(超时重传)
确认丢失和确认迟到的情况如下:
- 连续ARQ协议
发送方维持一个发送窗口,窗口内的分组都能连续发送,不需要等待确认,收到一个分组的确认,则发送窗口向前移动一格 接收方采用累积确认,即不需要对每一个分组进行确认,可以收到几个连续分组后,对最后一个分组进行确认,表示这个分组及其之前的分组都到达了 - 可靠传输的实现——滑动窗口机制
滑动窗口也用于流量控制,流量控制就是让发送方控制发送速率,免得接收方来不及接收,这里规定发送窗口大小不得超过接收窗口大小,这里接收方会通过(rwnd)不断提醒发送目前接收方接收窗口大小
TCP拥塞控制
发送方维持一个拥塞窗口
- 慢开始
拥塞窗口从1开始翻倍增长至阈值 - 避免拥塞
到达窗口阈值之后,线性增长,避免窗口太大造成拥塞 - 快重传
如果只是一时丢失确认造成超时,也适用慢开始算法的话,就太浪费资源了,因此接收方发送确认之后如果规定时间内未收到新的分组,则立刻重发确认三次。发送方如果收到连续三次确认,说明并未拥塞,只是偶然,因此执行快恢复算法,提高阈值,之后再进行避免拥塞 - 快恢复
三次握手
- client主动打开,发送连接请求报文段,首部SYN置1,随机取seq=x,进入SYN-SENT状态
- server收到后,发送反馈报文,SYN置1,ACK置1,ack取x+1,随机取seq=y,进入SYN-RCVD状态
- client收到后,勘查ack是否为x+1,发送确认,SYN置1,ACK置1,seq=x+1,ack=y+1,进入ESTABLISHED状态
- server收到后,进入ESTABLISHED状态
三次握手是为了避免client发送连接请求,该请求滞留在网络上,client重发请求,server收到重发的请求后,建立连接,发送数据后关闭连接,这时,滞留的请求却送到了server,server又建立新的连接,但此时client并没有需求,此连接被空置,浪费了资源
四次挥手
- client主动关闭,发送请求关闭报文,首部FIN=1,取seq为前面发送过的序号+1,即seq=u+1,进入FIN-WAIT-1状态
- server收到后,发送确认,ACK=1,seq=v,ack=u+1,随机进入CLOSE-WAIT状态,此时A->B方向已关闭,B->A方向还可以发送剩下的数据,因此是半关闭状态
- client收到确认之后,进入FIN-WAIT-2状态,等待server发送的连接释放报文
- server发出连接释放报文,FIN=1,ACK=1,seq=w,ack=u+1,进入LAST-WAIT状态
- client收到后,发出确认,ACK=1,seq=u+1,ack=w+1,进入TIME-WAIT状态
- server收到最后确认之后,进入CLOSED状态
-
client进入CLOSED状态
为何会有TIME-WAIT(2倍最长报文有效时间,4min)状态:
- client发出的最后确认可能会丢失,导致server超时重传连接释放报文,client如果已经关闭了,则无法重新确认,那么server收不到最后确认,无法关闭
- 使已失效的连接请求不会出现在本次连接中