一、三次握手
三次握手,即C/S模型下客户端与服务端连接要进行三次通信,一般由客户端主动发起,SYN是专门用来建立连接的标志位,在建立连接的过程中通常会携带数据包,如图中1000(0),1000表示数据包,(0)是数据包的大小,0表示无数据,纯建立连接,<mss 1460>,1460表示建立连接后传输数据的上限。服务器收到连接请求后同意连接会做应答,应答标志位是ACK,1001表示之前的数据都收到,SYN标志位占一个字节,所以是1001,同时服务器也会向客户端发起连接,发送SYN标志位,客户端收到服务器的连接请求,应答ACK标志位,三次握手至此建立完成,图中1、2、3位置是三次握手建立过程。三次握手由内核完成,写代码时accept函数和connect函数成功返回标志三次握手建立成功。
二、数据通信
数据收发时ACK标志位用来确认数据成功接收,图中4位置1001(20) ACK 8001 表示客户端向服务器发送1001数据包,大小为20,8001是回执,5位置的1021就表示前1021个数据成功接收。
三、四次挥手
断开连接一般由客户端发起,客户端发送FIN标志位(finish),服务器回执ACK标志位,一次半关闭完成,即客户端还能收到服务器的数据,但是不能发送(不能向服务器缓冲写数据),半关闭的存在是因为socket有两个缓冲区,读缓冲和写缓冲,半关闭是关闭缓冲区。服务器再发送FIN标志位,客户端回执ACK,四次挥手完毕,断开连接。