关于TCP三次握手和四次挥手,各位想必在读大学的时候或者是在面试的时候一定遇到过,三次握手和四次挥手本身是不是太难的,但它容易忘😞,今天我就在这里给大家讲解一下三次握手与四次挥手。
一、三次挥手
TCP三次握手建立连接,是TCP数据传输的必要过程。流程大致分为以下几步:
1、刚开始,客户端和服务器都处于CLOSED状态。
2、服务端创建传输控制块(TCB),时刻准备客户进程的连接请求,处于LISTEN监听状态。
3、第一次握手
客户端将TCP报文的标志位SYN置为1,随机产生一个序号值SEG=x保存在TCP首部的序列号字段里,然后指明客户端打算连接的服务器端口,并将数据包发送给服务器端。发送完毕后,客户端进入SYN-SEND状态。
4、第二次握手
服务端收到数据包后,由标志位SYN=1确认了客户端要请求建立连接。于是,服务端将TCP报文的标志位SYN和确认应答号ACK都置为1,请求号ACK=x+1(表示序列号为x的消息已经接收了,下一次传输的序列号为X+1),再随机产生一个序号值SEA=y,然后将该数据包发送给客户端以确认连接请求。这时,服务端进入SYN-RCVD状态。
5、第三次握手
客户端收到服务端的确认后,检查ACK是否为x+1,ACK是否为1,如果正确则将确认应答ACK置为1,请求号ack=y+1(表示序列号为v的消息已经接收了,下一次传输的序列号为V+1),并将数据包发送给服务器。服务器端检查ACK是否为y+1,ACK是否为1,如果正确则成功建立连接。客服端和服务器都进入ESTABLISHED状态,三次握手结束,客户端和服务器可以开始传输数据了。
在上述过程中,还有一些重要的概念:
①半连接
收到SYN包,但还未收到ACK包时的连接状态称为半连接,即尚未完全完成三次握手的TCP连接,处于第一次握手之后,第三次握手之前。
②半连接队列
在三次握手协议中,服务器维护一个半连接队列,该队列为每个客户端的SYN包开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认后。这些条目所标识的连接在服务器处于SYN-RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
通俗又简单的来说就是:
Client(客户端):嘿,李四,是我,听到了吗?
Server(服务器端):我听到了,你能听到我的吗?
Client(客户端):好的,我们互相都能听到对方的话,我们的通信可以开始了。
二、四次挥手
当数据传输完成后,为了节省服务器的资源和网络开销,需要进行断连。
简单理解为:电话打完了,需要我们手动进行挂电话的操作。
当客户端和服务器端都是连接状态时:
1、第一次挥手
客户端不想再进行数据传输了,就发起一条挥手请求,将TCP报文的标志位FIN=1,设置序列号SEQ为随机数x。此时,客户端进入FIN-WAIT-1状态;
2、第二次挥手
服务器端收到客户端的FIN数据报,知道客户端不再发送数据了。于是返回一条ACK确认消息,表示同意客户端的关闭请求,然后服务器端进入CLOSE-WAIT状态。当客户端收到服务器端的确认消息后,进入FIN-WAIT-2状态,等待服务器端的连接结束;
3、第三次挥手
服务器端发送数据完毕后,给客户端发送标志位为FIN的报文段,请求关闭连接,并进入LAST-ACK状态;
4、第四次挥手
当客户端收到FIN报文段之后,再向服务器端回复标志位为ACK的应答消息,然后进入TIME-WAIT状态,当等待2MSL(报文的最大存活时间,后面会详细讲解)后还没收到回复,证明服务器端已经正常关闭,于是客户端进入CLOSED状态。而服务器端在收到客服端的ACK报文段以后,就关闭连接,直接进入CLOSED状态。
通俗又简单的来说就是:
Client(客户端):我所有东西都说完了。
Server(服务器端):我已经全部听到了,但是等等我,我还没说完。
Server(服务器端):好了,我已经说完了。
Client(客户端):好的,那我们的通信结束。文章来源:https://www.toymoban.com/news/detail-449358.html
文章来源地址https://www.toymoban.com/news/detail-449358.html
到了这里,关于【新星计划-2023】TCP三次握手和四次挥手讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!