4、UNIX网络编程学习笔记--TCP三次握手和四次挥手

一、TCP三次握手

1、三次握手流程图,其中SYN即synchronous,同步;ACK即Acknowledgement,确认。


2、流程介绍

(1)在建立一个TCP连接之前,服务器需要准备好接收外来的连接。服务端通常通过调用socket、bind和listen这3个函数来完成。

(2)建立一个TCP连接时需要三次握手(three-way handshake),具体如下:

第一次握手:建立连接时,客户端发送 SYN 包(SYN=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认; 

第二次握手:服务器收到 SYN 包,必须确认客户的 SYN(ACK=j+1),同时自己也发送一个 SYN 包(SYN=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态; 

第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ACk=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。

(3)客户的初始序列号为J,服务器的初始序列号为K。因为SYN占据一个字节的序列号空间,所以每一个SYN的ACK中确认号就是该SYN初始化序列号+1。TCP会话的每一端都包含一个32位(bit)的序列号该序列号被用来跟踪该端发送的数据量。每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收。


3、举例子解释三次握手机制


(1)只有①,武庚不确定白菜能否收到信息;

(2)只有①②,白菜不确定武庚能否收到信息;

(3)①②③,双方都能确定对方能收到自己的信息。


二、TCP四次挥手

1、四次挥手流程图


2、流程介绍

(1)客户端 A 发送一个 FIN,用来关闭客户 A 到服务器 B 的数据传送;

(2)服务器 B 收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加 1。和 SYN 一样,一个 FIN 将占用一个序号;

(3)服务器 B 关闭与客户端 A 的连接,发送一个 FIN 给客户端 A;

(4)客户端 A 发回 ACK 报文确认,并将确认序号设置为收到序号加 1。


3、示例



致谢

1、《UNIX网络编程》卷一:套接字联网API  [第3版]  W.Richard Stevens、Bill Fenner、Andrew M.Rudoff 著

2、浅谈 TCP 三次握手和四次挥手





猜你喜欢

转载自blog.csdn.net/qq_38880380/article/details/80334006