TCP协议的握手和断开
Posted 六维世界
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP协议的握手和断开相关的知识,希望对你有一定的参考价值。
TCP是面向连接的协议,它在源点和终点之间建立虚拟连接,而不是物理连接
在数据通信之前,发送端与接收端要先建立连接,等数据发送结束后,双方再断开连接
三次握手
第一次握手主机A通过一个标识为SYN标识位的数据段发送给主机B请求连接,通过该数据段告诉主机B希望建立连接,需要B应答,并告诉主机B传输的起始序列号
第二次握手是主机B用一个确认应答ACK和同步序列号SYNC标志位的数据段来响应主机A,一是发送ACK告诉主机A收到了数据段,二是通知主机A从哪个序列号做标记。
第三次握手是主机A确认收到了主机B的数据段并可以开始传输实际数据。
四次断开
主机A发送FIN控制位发出断开连接的请求
主机B进行响应,确认收到断开连接请求
主机B提出反方向的关闭要求
主机A确认收到的主机B的关闭连接请求
从抓包工具上我们可以看它的握手过程和断开过程
这是三次握手阶段:
第一次握手,客户端向服务器发送seq序列号,这个序列号是随机的,ack为确认码,用于确认接收到了服务器发送的数据,因为第一次握手服务器还没发送数据,所以ack是0
第二次握手,服务器向客户端发送seq序列号,这个序列号也是随机的,ack为确认码,用于确认接收到了客户端发送的数据,ack=客户端的seq+1,告诉客户端接收到了上一个seq,下次请客户端从seq+1开始发
第三次握手,正式发送数据,客户端第一次发送的seq被确认收到,所以这次的seq为第二次握手时服务器的ack,表示客户端向服务器按顺序开始发送数据
。
。
。
之后开始正式发送数据,seq,ack依次递增
(只有前两次握手时候有SYN码,此时SYN=1,表示希望建立连接)
这是四次断开阶段:
第一次断开:客户端请求断开,会发送ack码,表示接收成功上次数据,并且发送FIN(finally的简写)码,FIN码为1表示请求断开
第二次断开:服务器接收到FIN码,首先发送一次ack码,表示接受成功数据
第三次断开:服务器在第二次断开之后,紧接着发送一个ack码和FIN码,请求断开
第四次断开:客户端发送ack码,表示接收到服务器请求,连接断开
为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
以上是关于TCP协议的握手和断开的主要内容,如果未能解决你的问题,请参考以下文章