TCP 传输控制协议(Transmission Control protocol)

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接(三次握手),传输完毕后还要断开连接(四次挥手)。

三次握手

①首先 Client 端发送连接请求报文SYN信号包,Seq随机数
②Server 段接受连接后回复 ACK 报文(客户端发送的Seq+1)和Seq随机数,并为这次连接分配资源。
③Client 端接收到 ACK 报文后也向 Server 段发生 ACK 报文,并分配资源,这样 TCP 连接就建立了。
在这里插入图片描述

四次挥手

① Clien发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
② Server收到FIN后,发送一个ACK给Client,Server进入CLOSE_WAIT状态。
③ Server发送一个FIN,用来yi关闭Server到Client的数据传送,Server进入LAST_ACK状态。
④ Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成四次握手。

在这里插入图片描述

TCP 段结构 (TCP segment structure)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-41l4KLeO-1653367207345)(.\image\TCP_segment_header.png)]

源端口 Source port (16 bits)

发送方端口信息

目标端口 Destination port (16 bits)

接收方端口信息

序列号 Sequence number (32 bits)

具有双重作用:

  • 如果 SYN 标志设置为 (1),则这是初始序列号。实际第一个数据字节的序列号和相应 ACK 中的确认号就是这个序列号加 1。
  • 如果 SYN 标志清零 (0),则这是当前会话的该段的第一个数据字节的累积序列号。

确认号 Acknowledgment number (32 bits)

如果设置了 ACK 标志,则该字段的值是 ACK 的发送者期望的下一个序列号。这确认收到所有先前的字节(如果有的话)。每一端发送的第一个 ACK 确认对方的初始序列号本身,但没有数据。

数据偏移量 Data offset (4 bits)

以 32 位指定 TCP 标头的大小。标题的最小大小为 5 个字,最大为 15 个字,因此最小大小为 20 个字节,最大为 60 个字节,标题中最多允许 40 个字节的选项。该字段的名称源于它也是从 TCP 段开始到实际数据的偏移量。

保留 Reserved (3 bits)

保留位,以备将来使用,应设置为零。

标志 Flags (9 bits)

TCP Flags

Reserved(3 位):预留位
NS(1 位):ECN-nonce - 隐藏保护
CWR(1 位):发送主机设置拥塞窗口减少(CWR)标志,表明它收到了一个设置了 ECE 标志的 TCP 段,并已在拥塞控制机制中作出响应。
ECE(1 位):ECN-Echo 具有双重作用,具体取决于 SYN 标志的值。它表明:
  如果 SYN 标志设置为 (1),则 TCP 对等体具有ECN能力。
  如果 SYN 标志清零 (0),则在正常传输期间接收到 IP 标头中设置了拥塞经历标志 (ECN=11) 的数据包。[b]这用作对 TCP 发送方的网络     拥塞(或即将发生的拥塞)的指示。
URG(1位):表示紧急指针字段是重要的
ACK(1 位):表示确认字段是重要的。客户端发送的初始 SYN 数据包之后的所有数据包都应设置此标志。
PSH(1 位):推送功能。要求将缓冲的数据推送到接收应用程序。
RST(1位):重置连接
SYN(1 位):同步序列号。只有从每一端发送的第一个数据包应该设置这个标志。其他一些标志和字段基于此标志改变含义,有些仅在设置时有     效,而另一些则在清除时有效。
FIN(1 位):来自发送方的最后一个数据包


                                    
                              +---------+ ---------\      active OPEN  
                              |  CLOSED |            \    -----------  
                              +---------+<---------\   \   create TCB  
                                |     ^              \   \  snd SYN    
                   passive OPEN |     |   CLOSE        \   \           
                   ------------ |     | ----------       \   \         
                    create TCB  |     | delete TCB         \   \       
                                V     |                      \   \     
                              +---------+            CLOSE    |    \   
                              |  LISTEN |          ---------- |     |  
                              +---------+          delete TCB |     |  
                   rcv SYN      |     |     SEND              |     |  
                  -----------   |     |    -------            |     V  
 +---------+      snd SYN,ACK  /       \   snd SYN          +---------+
 |         |<-----------------           ------------------>|         |
 |   SYN   |                    rcv SYN                     |   SYN   |
 |   RCVD  |<-----------------------------------------------|   SENT  |
 |         |                    snd ACK                     |         |
 |         |------------------           -------------------|         |
 +---------+   rcv ACK of SYN  \       /  rcv SYN,ACK       +---------+
   |           --------------   |     |   -----------                  
   |                  x         |     |     snd ACK                    
   |                            V     V                                
   |  CLOSE                   +---------+                              
   | -------                  |  ESTAB  |                              
   | snd FIN                  +---------+                              
   |                   CLOSE    |     |    rcv FIN                     
   V                  -------   |     |    -------                     
 +---------+          snd FIN  /       \   snd ACK          +---------+
 |  FIN    |<-----------------           ------------------>|  CLOSE  |
 | WAIT-1  |------------------                              |   WAIT  |
 +---------+          rcv FIN  \                            +---------+
   | rcv ACK of FIN   -------   |                            CLOSE  |  
   | --------------   snd ACK   |                           ------- |  
   V        x                   V                           snd FIN V  
 +---------+                  +---------+                   +---------+
 |FINWAIT-2|                  | CLOSING |                   | LAST-ACK|
 +---------+                  +---------+                   +---------+
   |                rcv ACK of FIN |                 rcv ACK of FIN |  
   |  rcv FIN       -------------- |    Timeout=2MSL -------------- |  
   |  -------              x       V    ------------        x       V  
    \ snd ACK                 +---------+delete TCB         +---------+
     ------------------------>|TIME WAIT|------------------>| CLOSED  |
                              +---------+                   +---------+

                      TCP Connection State Diagram

窗口大小 Window size (16 bits)

接收窗口的大小,它指定了该段的发送者当前愿意接收的窗口大小单位

校验和 Checksum (16 bits)

16 位校验和字段用于对 TCP 报头、有效负载和 IP 伪报头进行错误检查。伪报头由源 IP 地址目标 IP 地址、TCP 协议的协议号(6) 以及 TCP 报头和有效负载的长度(以字节为单位)组成。

紧急指针 Urgent pointer (16 bits)

如果设置了 URG 标志,那么这个 16 位字段是与指示最后一个紧急数据字节的序列号的偏移量。

选项 Options (变量 0–320 bits, 以 32 bits为单位)

该字段的长度由数据偏移量决定场地。选项最多有三个字段:Option-Kind(1 字节)、Option-Length(1 字节)、Option-Data(变量)。Option-Kind 字段指示选项的类型,并且是唯一不可选的字段。根据 Option-Kind 值,可以设置接下来的两个字段。Option-Length 表示选项的总长度,Option-Data 包含与选项相关的数据(如果适用)。

填充 Padding

字段指示选项的类型,并且是唯一不可选的字段。根据 Option-Kind 值,可以设置接下来的两个字段。Option-Length 表示选项的总长度,Option-Data 包含与选项相关的数据(如果适用)。

填充 Padding

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值