TCP三次握手
所谓握手,也就是建立连接,三次过程。
三次握手旨在连接到服务端的指定端口,进行通信。建立一个TCP连接,需要向客户端和服务端发送三个包。
其中包含同步序列号和确认号以及TCP窗口大小的信息交换。一般触发握手在socket中都是connect()函数触发的
第一次握手:
客户端发送TCP请求, (SYN标记位置1个包,SYN=1,ACK=0 也就是带有SYN标记的TCP包,初始序列号为X,保存在包头的序列号中). 表示客户端需要建立一个TCP连接,这是握手中的第一不,发送请求。
第二次握手:
服务端收到带有SYN标记的TCP包,发送确认包(带有ACK和SYN的数据包,SYN=1,ACK=1,序列号为y是服务端的)此时服务端询问客户端是否准备好数据传输,此时服务器进入SYN_RECV状态。。
第三次握手:
客户端接收到服务端的数据包(ACK+SYN数据包)向服务端发送一个(序列号x+1,ACK=y+1)的数据包,此包发送完毕,客户端和服务器进入ESTAB_LISHED(TCP连接成功)状态,完成三次握手。
TCP四次挥手
TCP连接是双工的,所以每个方向都是单独关闭。当其中一方完成数据传输后可以发送FIN结束。接收到了FIN只是意味着没有这个方向的数据流了
收到FIN的TCP连接可以发送数据,第一个关闭方执行主动动作,另一个执行被动动作。
第一次挥手:
客户端发送FIN请求,说我要关闭TCP连接了,不再传输数据了。 (FIN=1,序列号=n)
第二次挥手:
服务端收到这个请求,并且响应此请求,发送一个ACK包,确认ack为收到的序号+1。
第三次挥手:
服务端关闭TCP连接,向客户端发送FIN消息。
第四次挥手:
客户端接收到消息,发送ACK包确认,并将确认序号seq设置为收到序号+1。
本文来自 luoyan01 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/luoyan01/article/details/82910437?utm_source=copy
原文地址:http://blog.51cto.com/12910101/2296198