[Linux] | 您所在的位置:网站首页 › tcp三次握手四次挥手过程 › [Linux] |
目录 【三次握手】 【通信过程】 【四次挥手】 【完整通信过程】 在我们调用connect对客户端或者服务器发起连接的时候,其实底层有进行几次通信,需要用抓包才能捕获到,发起连接的三次通信叫做三次握手,只有三次握手的信号完成了,connect才会解阻塞往下执行。而close想要关闭套接字从而达到断开连接的时候,底层会进行四次通信,这叫做四次挥手 【三次握手】首先我们需要了解的是,TCP的报文的具体格式 如下控制位控制报文类型: SYN:置一,表示为连接请求报文 FIN:置一,表示请求关闭连接报文 ACK:表示当前为应答报文 URG:置一,表示紧急指针有效,告诉系统此报文有紧急数据,优先处理 PSH:推送报文 RST:复位连接 如下为服务器或者客户端的状态: ESTABLISHED:套接字已建立连接 SYN_SENT:套接字正在积极地尝试建立连接 SYN_RECV:从网络接收到一个连接请求 FIN_WAIT1:套接字已关闭,连接正在关闭 FIN_WAIT2:连接已关闭,套接字正在等待远程端关闭 TIME_WAIT:套接字关闭后等待处理仍在网络中的数据包 CLOSE:套接字没有被使用 CLOSE_WAIT:远程端已经关闭,等待套接字关闭 LAST_ACK:远程端关闭,套接字关闭。等待确认 LISTEN:套接字正在侦听传入的连接 CLOSING:两个套接字都关闭了,但我们仍然没有发送所有的数据 三次握手的详解: 一开始,客户端想要向服务器发送连接请求,此时先使用connect建立连接,当调用了connect,客户端此时处于SYN_SENT状态,向服务器发送SYN请求连接(第一次握手),并且序列号(seq)和确认号(ack)都为0。 在服务器接收到SYN连接请求之前,服务器均处于LISTEN监听状态,监听客户端的连接,当服务器接收到请求之后,此时状态变为SYN_RECV状态,然后向客户端发送ACK应答以及SYN请求连接报文(第二次握手),由于在握手和挥手期间,确认号为上一条对面发来的报文中的序列号加一,所以第二次握手seq为0,ack为1,当客户端接收到ACK应答以及SYN请求连接后,便处于ESTABLISHED状态。 然后由于客户端收到了服务器的请求连接报文,所以也需要发送应答,客户端给服务器发送ACK应答(第三次握手),此时seq为1,ack为1。当服务器接收到客户端的应答之后,变为ESTABLISHED状态。 【通信过程】在这里我们假设,客户端向服务器发送了了“hello tcp”,然后服务器向客户端发送了“ok” 这里我们要知道一点就是,ack增加的规则: 如果当前端接收到的另一端的上一条报文在三次握手或者四次挥手期间,ack只加一 如果当前段接收到的另一端的上一条报文在通信期间,则ack的值为ack加上当前段最后一次收到的对方的发送的数据的长度 通信过程的详解: 一开始客户端先向服务器发送“hello tcp”这九个字符,由于此时对于客户端来说,上一条接收到的报文为三次握手期间,服务器发送的报文,所以seq为1,ack为0+1为1 。 当服务器接受到报文之后,会向客户端发送应答,此时对于服务器来说,上一条接收到的最近的客户端报文为普通通信PSH报文,所以此时seq为1,而ack则为上次报文的seq加上数据长度,也就是1+9为10。 此时由服务器向客户端发送PSH通信报文,此时对于服务器来说,最近的上一次接收到的客户端发送的报文为PSH通信报文,所以seq为1,报文携带的数据长度为9,所以ack为1+9为10。 此时客户端接收到服务器发送的“ok”后,会发送ACK报文,此时对于客户端来说,接收到的最近的服务器报文为PSH报文,所以客户端发送的ACK报文中seq为10,ack为1+2为3。 【四次挥手】 四次挥手的详解: 当客户端调用close关闭套接字的时候,客户端会向服务器发送FIN请求,由于此时对于客户端来说,上一次接收到的最后一次服务器发来的报文为通信报文,且包含的数据长度为2,所以seq为10,ack为1+2为3。 当服务器接收到客户端发送的FIN请求后,会立即发送应答信号,此时对于服务器来说,最后一次接受到的客户端的报文为四次挥手的FIN请求,所以seq为3,ack为10+1为11。 当服务器从客户端的资源接受完毕以及回收好资源后,客户端会向服务器发送FIN请求,此时对于服务器来说,最后一次接收到的来自客户端的报文为四次挥手的FIN类型报文,所以seq为3,ack为10+1为11。 当客户端接受到来自服务器的FIN请求后,会向服务器发送ACK应答,此时对于客户端来说,最后一次接受的来自服务器的报文为四次挥手的FIN报文,所以seq为11,ack为3+1为4。 【完整通信过程】为什么握手三次,挥手有四次 握手的时候,当客户端向服务器发送SYN请求连接的时候,服务器可以将应答报文和请求连接报文一起发过去,但是断开连接的时候不行,断开连接的时候会立即应答,但是会等到服务器接受完全部数据并且回收完自身资源才会发送FIN请求给客户端要求断开连接,所以应答和请求必须分开,所以握手三次,挥手四次 为什么客户端在四次挥手的时候已经调用了close还可以收发服务器报文 此时套接字处于半关闭状态,应用层无法收发,但是底层可以 |
CopyRight 2018-2019 实验室设备网 版权所有 |