TCP三次握手和四次挥手
三次握手
TCP是运输层的协议,所以该协议为了保证运输的准确性。然后进行三次握手。
SYN(确认发送到接收):同步序列编号,是TCP/IP建立连接时使用的握手信息。
ACK(确认接收到发送):确认字符,表示发来的数据已经确认无误。
既然是传输的TCP报文,那么我们来看看TCP报文长什么样子!
第一次客户端发送:客户机发起连接请求,将SYN(同步序列编号)位设置为1,同时客户端选择了一个初始序列号x,并存在TCP报文段的序号中。
第二次服务端发送:服务端接收到该报文后,会为其分配TCP缓存和变量(这使得TCP容易受到SYN洪泛攻击的拒绝服务攻击),服务端会返回一个报文到客户端,其中SYN标志号为1,ack置1,确认号设置为x+1。然后并选一个自己的初始序列号y,放置到序号字段中。
第三次客户端发送:客户端收到服务端发来的报文后,客户端也要给该链接分配缓存和变量,然后再次发送一个确认报文给服务端,其中SYN置0,ack置1,将确认号设置为y+1,另外该报文段是可以携带数据:
为什么是三次握手
三次握手的目的是建立可靠的通信信道,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
为什么要传回SYN
接收端传回发送端所发送的SYN是为了告诉发送端,我接收到的信号信息确实就是你所发送的信号。
传SYN,为什么还要传ACK
双方通信无误必须是两者互相发送信息都无误。传了SYN,证明发送端发到接收方的通道没有问题,但是接收端到发送端的通道还需要ACK信号来进行验证。
第三次握手失败后,怎么办
如果第三次失败,过了超时计时器,服务端会重新发第二次的报文,要求客户端重传第三次报文,默认是5次,如果默认次数到了,还没有的话。服务端就关闭连接。
知道SYN攻击吗?如何防范?
SYN洪泛攻击就是利用第一次握手报文,服务器会为客户端请求分配缓存,那么黑客就可以利用假的ip疯狂去建立TCP连接,服务器会不断缓存,把服务器的连接资源消耗完。
服务器有SYN Cookie进行有效防御。当第一次报文来的时候,不给缓存,然后把第二次报文发给你客户端,客户端返回第三次报文的时候,检查无误,才建立具有套接字的全开的连接。但是有个缺点,第三次握手失败后,因为没有缓存,所以会重新三次握手。
四次挥手
第一次发报文:客户端发起连接释放的请求,设置FIN为1,序号会随机算出u;发送完毕后,客户端进入FIN-WAIT-1状态。
第二次发送报文:服务端接收到FIN报文后,会返回一个ACK报文,将ACK设置1,确认号为u+1;表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。发送完毕后,服务端会进入CLOSE-WAIT状态,客户端接受到这个确认包之后,进入FIN-WAIT-2状态,等待服务器端关闭连接
第三次报文:服务端准备好进行关闭时,想客户端发送一个结束连接请求,FIN置为1;发送完毕后,服务端进入LAST-ACK状态,等待来自客户端的最后一个ACK;
第四次报文:客户端收到第三次报文,知道服务器已经准备好关闭,客户端发送一个确认包,并进入TIME-WAIT状态,等待可能出现的要求重传的ACK报文;服务端收到这个确认包后,关闭连接,进入CLOSE状态;
客户端等待了某个固定时间之后(2倍最大段周期),没有收到服务器的ACK,认为服务端已经正常关闭,于是自己也关闭连接,进入CLOSE状态。
四次挥手重要的是TIME-WAIT状态,为什么需要这个状态呢?
要确保服务器是否收到了我们的ACK报文,如果没有收到的话,服务器会重新发FIN报文给客户端,那么客户端再次收到FIN报文之后,就知道之前的ACK报文丢失了,就会再次发送ACK报文。
为什么握手只要三次,挥手要四次
关键在于中间两步。
当客户端发了第一次报文的时候,服务端先告诉客户端你那边的关闭请求我收到了。但是我这边还有一些资源,你等等我。 然后当服务端传完资源后,在发一个FIN报文,说我这边有可以关闭了。所以这里会多一次服务端准备好关闭的流程。
为什么TIME_WAIT状态需要经过2MSL才能转换到CLOSE状态
2MSL是一个发送和一个回复所需要的最大时间。
更多相关计算机网络知识笔记
https://blog.csdn.net/qq_40262372/article/details/113763116
B站视频讲解如何三个月学习JAVA拿到实习Offer:
https://www.bilibili.com/video/BV1dV411t71K
B站,VX关注:万小猿,我们会不断努力更新更多相关的知识笔记
如果想要在学习的道路上和更多的小伙伴们交流讨论
请加Q群:725936761
欢迎每一位小伙伴的加入
我们一起朝着目标加油!冲锋陷阵!