一、TCP报头
二、TCP的三次握手:
第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
三,四次挥手:
-
第1次挥手:主动关闭方 向 被动关闭方 发送一个 FIN包 。也就是主动关闭方 告诉 被动关闭方 :我已经不会再给你发数据了。
-
第2次挥手:被动关闭方 收到 FIN包 后,发送一个 ACK包 给 主动关闭方 。 就告诉 主动关闭方 已收到通知 。
(在 被动关闭方 发送 FIN包 之前,被动关闭方 还是可以向 主动关闭方 发送数据的。)
-
第3次挥手:被动关闭方 又发送一个 FIN包,给 主动关闭方,用来关闭 被动关闭方 到 主动关闭方 的数据传送。
也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。 -
第4次挥手:主动关闭方 收到 FIN包后,发送一个 ACK包 给 被动关闭方 ,至此,完成四次挥手。
注意: 第2次和第3次, 被动关闭方 连续两次向 主动关闭方 发送报文。
四、主要字段
1)标志位(Flags):共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:
标志位 | 含义 | 说明 |
---|---|---|
SYN | 发起建立连接 | 当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该有 SYN=1,ACK=1。 |
ACK | 确认标识 | 当ACK=1,确认标识才有效。 (为了与 确认号ack 区分开,我们一定要用大写字母) |
FIN | 释放连接 | 当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放。 |
PSH | 读取数据 | 当PSH=1,提示接收端应用程序立即从TCP缓存区把数据读走。 |
RST | 重置连接 | 当RST=1,表时TCP连接出现严重差错,必须释放连接,在后再重新连接。 |
URG | 紧急指针 | 当URG=1,表明紧急指针字段有效,告诉系统此报文段中有紧急数据。 |
2)序号(sequence number):seq序号,占32位。用来标识从TCP源端向目的端发送的字节流,发起方 发送数据时 对此进行标记。
3)确认号(acknowledgement number):ack序号,占32位。只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
说明:
SYN 是标志位,表示发起建立一个连接。
seq 即 seq序号,表示 发起方 发送 数据 进行标记。
ACK 是 标志位中的 确认标识。
ack 是 确认序号,接收到的对方的数据,ack=seq+1。