先上一张形象图:
正图:
三次握手过程简述:
1:客户端发起请求建立连接,数据报文中标志位SYN=1(表示建立连接),同时要生成一个随机的32位序列号seq=x。
2:服务端serve收到后就知道,客户端想要建立连接,于是发送一个数据报文,其中SYN=1,也会生成一个序列号seq=y,还会有一个标志位ACK=1(表示确认号有效),同时还有一个ack(确认号)=x+1,此时表示服务端告诉客户端,接下来你给我发的数据报文要从x+1开始。
(此时,对于客户端而言,我给服务端发送信息,服务端回复我了,同时我能收到服务端的信息,说明客户端这边是没问题的。但是服务端发给客户端的报文,客户端一定能收到吗?)
3:为了安全,为了可靠,显然两次握手达不到这个目的,服务端只能知道我能收到客户端信息,但是客户端能不能收到我的信息还不确定。所以客户端在收到服务端的消息后,立马返回给服务端一个信息,其中ACK=1,ack=y+1,道理同上,至此两方面通信都可以进行。
4:(上图中,ACK为标志位,seq为序号,ack为确认号序列)。
四次挥手过程简述:
1:服务端要断开连接,发送报文中的标志位FIN=1,seq也是有的但不是随机生成的,而是随着通信的进行不断叠加的,假设到seq=x+2。
2:服务端进行应答,其中标志位ACK=1,ack=y+1,于是客户端就知道服务端已经收到了我的消息
3:服务端向客户端发送报文消息,其中FIN=1,seq=,此时服务端得到的消息是,客户端不会在向我发送数据报文了,客户端已经准备好断开了,但是服务端可能还有消息给客户端?所以2.3次握手是不能合并的。
4:客户端同理进行应答,其中ACK=1,ack=*,至此成功的断开连接。
注意:TCP/IP连接是安全的,是建立在连接上的。TCP 使用四次挥手的原因是因为 TCP 的连接是全双工的,所以需要双方分别释放到对方的连接,单独一方的连接释放,只代 表不能再向对方发送数据,连接处于的是半释放的状态。
为什么是要三次握手,不是二次四次。
简单来说,两次不够安全,四次过于浪费。
严格来说可以从三次握手过程来看,客户端发起请求建立连接必须要发送标识码,服务端收到客户端想要连接的标识码后,也会发返回一个确认号,并且告诉客户端接下来你发给我的数据报文要从X+1开始。此时服务端不知道客户端是否收到这个消息。所以两次握手是不够的。因此在客户端收到服务端的响应后,会再次发送新的报文。通过这三次链接,不管是客户端还是服务端,都知道要给对方发消息,也能收到对方的响应。所以这个链接就已经被安全的建立了。
面试场景:(建议梳理成自己的方式,熟悉表达)
TCP/IP 协议是传输层的一个面向连接的安全可靠的一个传输协议,三次握手的机制是为了保证能建立一个安全可靠的连接,那么第一次握手是由客户端发起的,客户端会向服务端发送一个报文,告诉服务端我要发起链接了。服务端收到这个报文后,知道客户端要和我建立连接,于是服务端就会向客户端发送一个确认消息,表示确认客户端发起第一次链接请求。经过以上两次握手之后,对于客户端而言,已经明确了能给服务端发送成功消息,也能收到服务端的响应,但是对于服务端来说是不够的。因为两次握手服务器知道了客户端要向我链接,我响应给客户端的消息客户端是否能收到,服务端不确定的。所以此时还需要第三次握手。第三次握手就是当客户端收到我的确认消息后,还要继续给服务端进行回应。通过以上3次链接,不管是客户端还是服务端都知道既能给对方发送消息,也能收到对方的响应,那么这个连接就被安全的建立了。
因为TCP协议是通讯双方的,所以断开连接也需要四次挥手。四次挥手也是有客户端发起的,客户端会发送一个我要断开连接的报文发给服务端,服务端此时不一定做好准备了,因为当客户端发起断开连接这个消息的时候,服务端可能还有未发送完的消息,服务端还要继续发送。所以服务端会告诉客户端,我还没做好准备,你还要等我一下。等服务端完全准备好后,就会发一个新的消息给客户端,告诉客户端,我准备好了。你可以断开连接了。客户端收到后,会发送一个包给服务端,好的,那我这边就断开了。不用回复了。通过这四次的相互连接,不管是服务端还是客户端度一斤刚做好了断开连接的准备,于是连接就断开了。
以上就是我个人对三次握手和四次挥手的一个理解。