TCP协议详解

 TCP报文格式

各字段的含义如下:

  • Sequence Number: 序号, 简称Seq, 占32位, TCP 连接中, 传送的字节流中的每个字节, 都是按顺序去编号的. 例如, 一段报文的序号字段值是107, 而携带的数据共有100个字节, 那么如果有下一个报文段的话, 其序号就是107+100, 也就是207开始.
  • Acknowledgment Number: 确认号, 简称 ack, 占32位, 是期望收到对方下一个报文的第一个数据字节的序号. 例如, B 收到了 A 发送过来的报文, 其 seq 是301, 而数据长度是200字节, 这表明了 B 正确收到了 A 发送的到序号500为止的数据, 301+200-1=500. 因此, B 期望收到 A 的下一个数据序号是501, 于是 B 在发送给 A 的确认报文段中会把 ack 确认号置为501.
  • TCP Flags: 控制位, 主要有8个标志位组成, 每一个标志位表示一个控制功能. 常见的六个:
  • URG:紧急指针标志, 当它为1时表示紧急指针有效, 为0则忽略紧急指针.
  • ACK:确认序号标志, 当它为1时, 表示确认号有效, 为0表示报文中不含确认信息, 忽略确认号字段.
  • PSH:push标志, 为1时表示是带有push标志的数据, 指示接收方在接收到该报文段以后应尽快将这个报文段交给应用程序而不是在缓冲区排队.
  • RST:重置连接标志, 用于重置由于主机崩溃或其他原因而出现的错误连接, 或者用于拒绝非法的报文段和拒绝连接请求.
  • SYN:同步序号,用于建立连接过程. 
  • FIN:finish标志,用于释放连接.

TCP三次握手

所谓三次握手(Three-way Handshake),是指建立TCP连接时,需要客户端和服务端总共发送的3个包。

第一次握手:Client将标志位SYN置为1,随机产生一个值seq=x,(这个 x 可以是一个任意的正整数), 将该数据包发送给Server,Client进入SYN_SENT(同步已发送)状态,等待Server确认. 这个报文也是不能携带数据的.

第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD(同步收到)状态. 这个报文也是不能携带数据的.

第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了. 这个 ACK 报文段是可以携带数据的.

TCP四次挥手

  1. 假设客户端A主动关闭连接, 此时需要发送连接释放报文段: 首部终止控制位FIN为1,序号seq=u,其中u等于前面传送过的数据的最后一个字节的
    序号加1。之后A进入FIN-WAIT-1(终止等待1)状态;
  2. 服务器B收到连接释放报文段后立即发出确认, 确认号ack=u+1,序号seq=v,其中v等于前面传送过的数据的最后一个字节的序号加1。之后B进入
    CLOSE-WAIT(关闭等待)状态,并通知高层应用进程。此时TCP连接处于半关闭状态,即A已经没有数据需要发送,但如果B发送数据,A仍要接收;
  3. A收到来自B的确认后就进入FIN-WAIT-2(终止等待2)状态,等待B发出连接释放报文段;
  4. 若高层应用进程已经没有数据要发送,则通知B释放TCP连接。此时B发出释放连接报文段:首部终止控制位FIN为1,序号seq=w(在半关闭状态下B可能
    又发送了一些数据),另外还需要重复上次已经发送过的确认号ack=u+1。之后B进入LAST-ACK(最后确认)状态;
  5. A收到B的连接释放报文段后,发出最后确认:ACK=1,ack=w+1,seq=u+1,然后进入TIME-WAIT(有时间限制的等待)状态;
  6. B收到来自A的最后确认后进入CLOSED(关闭)状态;
  7. A经过2倍的MSL(Maximum Segment Lifetime,最长报文段寿命)后才进入CLOSED状态。

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅
表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方
来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

 

 参考资料:

详解 四层、五层、七层 计算机网络模型

posted @ 2020-08-04 17:53  景岳  阅读(463)  评论(0编辑  收藏  举报