Tcp三次握手,四次挥手

linux学习笔记

TCP三次握手

1)源主机 A 的 TCP 向主机 B 发送连接请求报文段,其首部中的 SYN(同步)标志位应置为 1,表示想跟目标主机 B 建立连接,进行通信,并发送一个同步序列号 X(例:SEQ=100)进行同步,表明在后面传送数据时的第一个数据包的序号为 X+1(即 101)。
2)目标主机 B 的 TCP 收到连接请求报文段后,如同意,则发回确认。再确认报中应将 ACK 位和SYN 位置为 1.确认号为 X+1,同时自己也发送一个序号 Y。
3)源主机 A 的 TCP 收到目标主机 B 的确认后,要给目标主机 B 发出确认。其 ACK 置为 1,确认号为 Y+1,而自己的序号为 X+1。TCP 的标准规定,SYN 置 1 的报文段要消耗掉一个序号。
运行客户进程的源主机 A 的 TCP 通知上层应用进程,连接已经建立。当源主机 A 向目标主机 B 发送第一个数据报文段时,其序号仍为X+1,因为前一个确认报文段并不消耗序号。
当运行服务进程的目标主机 B 的 TCP 收到源主机 A 的确认后,也通知其上层应用进程,连接已经建立。至此建立了一个全双工的连接。

·SYN:用于建立连接。当 SYN=1 时,表示发起一个连接请求。
·ACK:ACK 位置 1 表明确认号是合法的。如果 ACK 为 0,那么数据报不包含确认信息,确认字段被省略。TCP 规定,连接建立后,ACK 必须为 1。
·FIN:用于释放连接。当 FIN=1 时,表明此报文段的发送端的数据已发送完成,并要求释放连接。

图解TCP中的三次握手流程

Tcp三次握手,四次挥手_第1张图片
即三个步骤:
1.请求连接,发送数据包序列号
2.请求连接,应答连接,确认序列号,自己的数据包序列号
3.应答连接,自己的数据包序列号,确认序列号
(确认序列号,就是对对方发过来的序列号的确认,为对方的序列号+1)

例:用wireshark抓包:
Tcp三次握手,四次挥手_第2张图片

TCP四次挥手

由于 TCP 连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个 FIN 来终止这个方向的连接。收到一个 FIN 只意味着这一方向上没有数据流动,一个 TCP 连接在收到一个 FIN 后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

(1) TCP 客户端发送一个 FIN,用来关闭客户到服务器的数据传送。
(2) 服务器收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加 1。和 SYN 一样,一个
FIN 将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个 FIN 给客户端。
(4) 客户端发回 ACK 报文确认,并将确认序号设置为收到序号加 1。

图解TCP四次挥手

Tcp三次握手,四次挥手_第3张图片

Tcp三次握手,四次挥手_第4张图片

为什么握手三次,挥手四次?

(假设客户端主动,服务器端被动)
在TCP三次握手中,服务器端的SYN和ACK是放在一个TCP报文段中向客户端发送的,而在断开连接的过程中,服务器端向客户单端发送的ACK和FIN是是分别在两个不同的TCP报文段中。这是因为在服务器端接收到客户端的FIN后,服务器端可能还有数据要传输,所以先发送ACK,服务器端把数据发完之后就可以发送FIN断开连接了。

你可能感兴趣的:(网络通信协议,网络协议,网络通信)