TCP三次握手四次握手以及滑动窗口机制

要想成为强者,就不要回避心里的恐惧。

Posted by 南方 on July 8, 2018

特点

UDP用户数据报协议

  • 无连接
  • 尽最大努力交付
  • 面向报文
  • 没有拥塞控制

TCP传输控制协议

  • 面向连接
  • 提供可靠交付
  • 全双工通信
  • 面向字节流

TCP报文段首部格式

TCP连接过程主要解决三个问题

  1. 使每一方能确知对方的存在
  2. 允许协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项等)
  3. 对运输实体资源(如缓存大小)进行分配

TCP报文段的首部格式

字段解释

  1. 源端口和目的端口 分别写入源端口号和目的端口号
  2. 序号 报文段序号 如一报文段序号字段值是301,携带数据共有100字节,即本报文段数据的第一个字节序号是301,最后一个字节序号是400,下一个报文段(如果还有)的数据序号从401开始
  3. 确认号 期望收到对方下一个报文段的第一个数据字节的序号 如服务器正确收到了客户端发送过来的一个报文段,其序号字段值是501,数据长度是200字节,这表明服务器正确收到了到序号700为止的数据,因此服务器期望收到下一个数据序号是701
  4. 数据偏移
  5. 保留
  6. 紧急URG URG=1时此报文段中有紧急数据应尽快送达
  7. 确认ACK ACK=1时确认号字段才有效
  8. 推送PSH PSH=1接收方尽快交付接收应用进程,不再等整个缓存填满后再向上交付
  9. 复位RST RST=1表明连接出现严重差错,必须释放再重新建立运输连接
  10. 同步SYN SYN=1 ACK=0表示连接请求报文,若对方同意连接则返回SYN=1 ACK=1
  11. 终止FIN FIN=1表明此报文段的发送方的数据已经发送完毕并要求释放连接
  12. 窗口 发送本报文段的一方的接收窗口
  13. 校验和 检验范围包括首部和数据这两部分
  14. 紧急指针 URG=1时指出本报文段中紧急数据的字节数
  15. 项 长度可变

三次握手和四次挥手

三次握手

  • 服务器进程进入监听LISTEN
  • 客户端向服务器发起连接请求,设置SYN=1 seq=x,进入SYN_SENT
  • 服务器收到请求同意连接,返回SYN=1 ACK=x+1 seq=y,进入SYN-RCVD
  • 客户端收到服务器确认,设置SYN=1 seq=x+1 ACK=y+1,进入ESTABLISHED
  • 服务器收到客户端确认后进入ESTABLISHED
  • 若最后服务器向客户端发送的报文拆成两部分ACK=1 ack=x+1 和 SYN=1 seq=y 就变成了四次握手

四次挥手

  • 客户端设置FIN=1 seq=x+2,进入FIN_WAIT-1
  • 服务器收到释放连接报文段后发出确认ACK=x+3,进入CLOSE-WAIT
  • 客户端收到服务器确认后,进入FIN-WAIT-2,等待服务器发出释放报文段
  • 服务器没有发送的数据,应用进程通知TCP释放连接,FIN=1 seq=y+1,服务器进入LAST-ACK
  • 客户端收到服务器的释放报文段后,进入TIME_WAIT,完成后进入CLOSED
  • 服务器收到了客户端的确认后进入CLOSED

窗口滑动机制

TCP滑动窗口是以字节为单位,一是提供TCP的可靠性,二是提供TCP的流控特性。同时滑动窗口机制还体现了TCP面向字节流的设计思路。

1 基本原理

滑动窗口基本原理

对于TCP会话的发送方,任何时候在其发送缓存内的数据都可以分为4类。

  • 已经发送并得到对端ACK的
  • 已经发送但还未收到对端ACK的
  • 未发送但对端允许发送的
  • 未发送且对端不允许发送

已经发送但还未收到对端ACK的未发送但对端允许发送的这两部分数据称之为发送窗口。

image

2 实现面向流的可靠性

  1. 最基本的传输可靠性来源于确认重传机制。
  2. TCP的滑动窗口的可靠性也是建立在确认重传基础上的。
  3. 发送窗口只有收到对端对于本段发送窗口内字节的ACK确认,才会移动发送窗口的左边界。
  4. 接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。