如果对网络工程基础不牢, 建议通读《细说 OSI 七层协议模型及 OSI 参考模型中的数据封装过程?》
下面就是 TCP/IP(Transmission Control Protoco/Internet Protocol )协议头部的格式, 是理解其它内容的基础, 就关键字段做一些说明
Source Port 和 Destination Port: 分别占用 16 位, 表示源端口号和目的端口号; 用于区别主机中的不同进程, 而 IP 地址是用来区分不同的主机的, 源端口号和目的端口号配合上 IP 首部中的源 IP 地址和目的 IP 地址就能唯一的确定一个 TCP 连接;
Sequence Number:TCP 连接中传送的字节流中的每个字节都按顺序编号, 用来标识从 TCP 发送端向 TCP 收收端发送的数据字节流, 它表示在这个报文段中的的第一个数据字节在数据流中的序号; 主要用来解决网络报乱序的问题;
Acknowledgment Number: 期望收到对方下一个报文的第一个数据字节的序号个序号, 因此, 确认序号应当是上次已成功收到数据字节序号加 1. 不过, 只有当标志位中的 ACK 标志 (下面介绍) 为 1 时该确认序列号的字段才有效. 主要用来解决不丢包的问题;
Offset: 它指出 TCP 报文的数据距离 TCP 报文段的起始处有多远, 给出首部中 32 bit 字的数目, 需要这个值是因为任选字段的长度是可变的. 这个字段占 4bit(最多能表示 15 个 32bit 的的字, 即 4*15=60 个字节的首部长度), 因此 TCP 最多有 60 字节的首部. 然而, 没有任选字段, 正常的长度是 20 字节;
TCP Flags:TCP 首部中有 6 个标志比特, 它们中的多个可同时被设置为 1, 主要是用于操控 TCP 的状态机的, 依次为 URG,ACK,PSH,RST,FIN. 每个标志位的意思如下:
SYN(Synchronize Sequence Numbers)- 同步序列编号 - 同步标签
The segment is a request to synchronize sequence numbers and establish a connection. The sequence number field contains the sender's initial sequence number.
该标志仅在三次握手建立 TCP 连接时有效. 它提示 TCP 连接的服务端检查序列编号, 该序列编号为 TCP 连接初始端 (一般是客户端) 的初始序列编号. 在这里, 可以把 TCP 序列编号看作是一个范围从 0 到 4,294,967,295 的 32 位计数器. 通过 TCP 连接交换的数据中每一个字节都经过序列编号. 在 TCP 报头中的序列编号栏包括了 TCP 分段中第一个字节的序列编号.
在连接建立时用来同步序号. 当 SYN=1 而 ACK=0 时, 表明这是一个连接请求报文. 对方若同意建立连接, 则应在响应报文中使 SYN=1 和 ACK=1. 因此, SYN 置 1 就表示这是一个连接请求或连接接受报文.
ACK(Acknowledgement Number)- 确认编号 - 确认标志
The segment carries an acknowledgement and the value of the acknowledgement number field is valid and contains the next sequence number that is expected from the receiver.
大多数情况下该标志位是置位的. TCP 报头内的确认编号栏内包含的确认编号 (w+1,Figure-1) 为下一个预期的序列编号, 同时提示远端系统已经成功接收所有数据.
TCP 协议规定, 只有 ACK=1 时有效, 也规定连接建立后所有发送的报文的 ACK 必须为 1
网络上有很多错误说法, 比如: ACK 是可能与 SYN,FIN 等同时使用的, 比如 SYN 和 ACK 可能同时为 1, 它表示的就是建立连接之后的响应, 如果只是单个的一个 SYN, 它表示的只是建立连接. TCP 的几次握手就是通过这样的 ACK 表现出来的. 其实: ACK&SYN 是标志位,
FIN(Finish)- 结束标志
The sender wants to close the connection
用来释放一个连接.
当 FIN = 1 时, 表明此报文段的发送方的数据已经发送完毕, 并要求释放连接.
URG (The urgent pointer)- 紧急标志
Segment is urgent and the urgent pointer field carries valid information.
当 URG=1, 表明紧急指针字段有效. 告诉系统此报文段中有紧急数据
PSH (Push)- 推标志
The data in this segment should be immediately pushed to the application layer on arrival.
PSH 为 1 的情况, 一般只出现在 DATA 内容不为 0 的包中, 也就是说 PSH=1 表示有真正的 TCP 数据包内容被传递.
RST (Reset)- 复位标志
There was some problem and the sender wants to abort the connection.
当 RST=1, 表明 TCP 连接中出现严重差错, 必须释放连接, 然后再重新建立连接
Windows(Advertised-Windows)- 窗口大小: 滑动窗口, 用来进行流量控制. 占 2 字节, 指的是通知接收方, 发送本报文你需要有多大的空间来接受
- CWR (Congestion Windows Reduced)
- Set by an ECN-Capable sender when it reduces its congestion Windows (due to a retransmit timeout, a fast retransmit or in response to an ECN notification.
- ECN (Explicit Congestion Notification)
During the three-way handshake it indicates that sender is capable of performing explicit congestion notification. Normally it means that a packet with the IP Congestion Experienced flag set was received during normal transmission. See RFC 3168 for more information.
TCP 的连接建立和连接关闭, 都是通过请求 - 响应的模式完成的. 我们来看下图, 应该基本能够理解 TCP 握手挥手过程
Three-way Handshake 三次握手
来源: https://www.cnblogs.com/zhoulujun/p/9956779.html