计算机网络面试

”三次握手”的详解

所谓的三次握手即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的。

以下为客户端主动发起连接的图解:

 

 

握手之前主动打开连接的客户端结束CLOSED阶段,被动打开的服务器端也结束CLOSED阶段,并进入LISTEN阶段。随后开始“三次握手”:

(1)首先客户端向服务器端发送一段TCP报文,其中:

位为SYN,表示“请求建立新连接”;序号为Seq=X(X一般为1);随后客户端进入SYN-SENT阶段

(2)服务器端接收到来自客户端的TCP报文之后,结束LISTEN阶段。并返回一段TCP报文,其中:

标志位为SYN和ACK,表示“确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接”(即告诉客户端,服务器收到了你的数据);

序号为Seq=y;确认号为Ack=x+1,表示收到客户端的序号Seq并将其值加1作为自己确认号Ack的值;随后服务器端进入SYN-RCVD阶段。

(3)客户端接收到来自服务器端的确认收到数据的TCP报文之后,明确了从客户端到服务器的数据传输是正常的结束SYN-SENT阶段。并返回最后一段TCP报文。其中:

标志位为ACK,表示“确认收到服务器端同意连接的信号”(即告诉服务器,我知道你收到我发的数据了);

序号为Seq=x+1,表示收到服务器端的确认号Ack,并将其值作为自己的序号值;

确认号为Ack=y+1,表示收到服务器端序号Seq,并将其值加1作为自己的确认号Ack的值;

随后客户端进入ESTABLISHED阶段。服务器收到来自客户端的“确认收到服务器数据”的TCP报文之后,明确了从服务器到客户端的数据传输是正常的。结束SYN-RCVD阶段,进入ESTABLISHED阶段。

在客户端与服务器端传输的TCP报文中,双方的确认号Ack和序号Seq的值,都是在彼此Ack和Seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性。一旦出现某一方发出的TCP报文丢失,便无法继续"握手",以此确保了"三次握手"的顺利完成。

为什么要进行三次握手

防止服务器端开启一些无用的连接增加服务器开销

防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

两次握手的话,不能确认客户端是否收到了服务器返回的报文,无法确认服务器到客户端的链路是否正常

四次挥手

 

 

由于TCP连接是全双工的,断开一个TCP连接,需要客户端与服务器发送四个包来确认连接的断开

第一次挥手:

客户端请求关闭链接,客户端向服务端发送一个报文,报文内容将FIN置为1,序号seq=u,发送给服务端,进入FIN_WAIT_1状态

第二次挥手:

服务端收到第一次挥手的报文,结束EStablished状态,并返回一段报文,将标志位ACK置为1,ack=u+1,seq=v,服务端进入CLOSE_WAIT状态
客户端收到响应后,进入FIN_WAIT_2状态

第二次挥手后,客户端向服务端发送数据的链路被关闭了。

 

第三次挥手;

Server在结束所有数据传输后,将Fin置为1,ACK=1,seq=w,ack=u+1;发送给Client,进入
LAST_ACK状态

第四次挥手:

Client收到后,返回一个报文,将ACK置为1,seq=u+1,ack=u+1,响应给Server,进入TIME_WAIT状态,等待
2MSL后,进入CLOSED状态
Server收到后,进入CLOSED状态

 

  • 刚开始都处于连接状态,进行数据传送

  • 客户端主动发起了关闭连接的请求,发送连接释放报文:FIN=1,seq=v。然后客户端就进入FIN-WAIT-1状态。此时FIN报文即使不携带数据,也要消耗一个序列号

  • 服务端接收到这个FIN后,服务端关闭读通道,并回复一个ACK:ACK=1,ack=v+1,seq=w。进入CLOSE-WAIT状态。当然也占用一个序列号。

    客户端在收到服务端的ACK后,关闭写通道,进入FIN-WAIT-2 的状态,等待服务端发送释放报文。此时客户端处于半关闭,不能发送数据,但是可以接收数据。

  • 当服务端处理完成以后,发送释放报文到客户端:FIN=1,seq=x,ACK=1,ack=v+1。服务端进入LAST-ACK状态,等待客户端的回复。

  • 客户端收到服务端的释放报文后,关闭读通道,并给服务端返回一个ACK: ACK=1,ack=x+1,seq=v+1。进入TIME-WAIT状态。

服务器收到客户端的ACK后,关闭写通道,并且直接CLOSED连接

 

TIME-WAIT一般为2个MSL(报文最长寿命),如果在这个时间段内没有收到服务端的超时重发,说明客户端发过去的ACK服务端收到了并且已经关闭连接,客户端才进入CLOSED状态。

那为什么是两个MSL呢:

第一个MSL 是保证最后一次挥手报文到达了服务端

第二个MSL 是保证服务端没有重发新的报文给客户端,没有超时重传

 

Http与Https

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

 

 

 

posted @   堤苏白  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示