最近在思考一个问题,当我们在浏览器中输入URL按下回车键后,他的详细流程是怎样的;以前刚用springMVC的时候弄懂了一个请求的流程,好几个月以为那就是我想要的答案了,最近这段时间熟悉了好多东西,准备新写一个从 输入URL到页面展示的 细节系列,想必写完自己也收获颇丰~ 今天先写一篇三次握手与四次挥手来开个头;
先说说什么是TCP协议,TCP协议是一个面向连接的协议,在运用此协议进行数据传输前都会进行连接的建立工作(三次握手);当数据传输完毕,连接的双方都会通知对方要释放这次连接(四次挥手);
分析三次握手和四次回收前先认识一下TCP的标志位:
TCP标志位有6种标示:
SYN(synchronous 建立联机)
ACK(acknowledgement 确认)
PSH(push 传送)
FIN(finish 结束)
RST(reset 重置)
URG(urgent 紧急)
先看三次握手
首先Client端发送连接请求报文,Server段接受连接后回复ACK报文(回一个包过去),并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。
通俗的解释:
第一次握手:客户端对服务端说:服务端你好,我现在想跟你建立一次TCP连接;
第二次握手:服务端对客户端说:客户端你好,我收到你想跟我建立连接的消息了,我马上就去为我们的连接做准备(分配资源),我现在也发个消息(ACK)给你,你看看你可以收到我发的消息吗?
第三次握手:客户端对服务端说:收到了收到了,我收到了你给我的消息(ACK)了,看来我们连接是没问题的,我们来建立连接吧~
客户端先尝试跟服务端建立连接,服务端收到连接的请求后告诉客户端我可以收到你发给我的消息,双方确认都能收到对方的消息后,才开始的连接;为什么是三次握手,而不是两次呢? 因为如果没有第三次握手,服务端第二次握手后就会为建立连接做准备,等待的连接过程是相当消耗资源的,如果第三次客户端不想跟服务端握手了呢(或者说超时)? 服务端就会关闭这次连接,close掉资源;三次握手可以保证建立连接的同事不会浪费掉资源;
四次挥手;
三次握手大多数朋友还都是比较清楚的,四次挥手貌似还记得的人就不太多了;
这里我直接大白话解释了~
因为tcp连接是双向的,所以,关闭也是双向的~
第一次握手:客户端告诉服务端:我的数据已经都发送完了,我准备断开连接了哈;
第二次握手:服务端告诉客户端:好的,我收到了你准备断开连接的请求了,但是我还有数据没有发送完,你再等等哈,我发完了会告诉你的;
第三次握手:服务端告诉客户端:好的,我所以数据都发完了,我也准备跟你断开连接了;你再给我挥次手我就知道你断开了连接,我也就马上断开;此时服务端会给自己设置一个定时器~(这里有个定时器是重点!)
第四次握手:客户端告诉服务端:好的,我断开连接了~, 服务端收到客户端断开连接的消息后服务端自己也断开了连接;
客官你稍等,还有一个重点没讲完;这里还需要详细的补充一下第四次握手~
客户端告诉服务端他要断开连接的时,客户端怕服务端因为网络或者其他原因不知道他真的断开了连接;客户端发完通知后会把自己设置成为TIME_WAIT状态,当第三次握手完后,服务端在定时器规定的范围内没有收到客户端传来的第四次挥手消息,那么服务端会重复的和客户端进行第三次握手,如果服务端在两倍报文时间内内没有给客户端发消息,那么客户端就默认服务端已经断开了~
这就是三次握手和四次挥手~