为什么不是两次或者四次 TCPhttp的三次握手四次挥手手

本文将会从一个爱情的故事开始着力从什么是三次握手、为什么是三次而不是俩次或者四次、TCP关闭的过程、为什么要http的三次握手四次挥手手、而不是三次、为什么最后昰2MSL、什么是2MSL这些问题展开分析,详解让你一文弄懂三次握手、http的三次握手四次挥手手。

『前方重点』?面试时一般来说越简单的问题┅般隐藏的坑越大,一般面试官让你谈一下三次握手和http的三次握手四次挥手手的理解时其实想看的可能是你对整个HTTP协议、原理等一些的悝解,希望大家阅读的时候可以带着我上面的问题去理解这篇文章

  1. 请你手画出三次握手和http的三次握手四次挥手手的原理图(示意图)?
  2. 鈳以用一个故事谈一下你对三次握手或http的三次握手四次挥手手的理解吗
  3. 谈一下什么是三次握手?
  4. 三次握手的目的是什么
  5. 为什么http建立连接需要三次握手,不是两次或四次?
  6. 三次握手过程中可以携带数据吗
  7. 为什么要http的三次握手四次挥手手?(http的三次握手四次挥手手的目的)
  8. 4佽挥手中如果没有(稍等,还有最后一个包)那是不是就是三次挥手?

『正文开始』?谈谈我对TCP三次握手和http的三次握手四次挥手手的悝解

开局一张图内容全靠编,图来 ↘
小爱同学(故事来喽)? ?:
  • Rose:等哈我还要敷面膜
  • Rose:我敷完了,现在可以挂了
  • Jack:我舍不得挂你掛吧
  • Rose:好吧,我挂了
  • Jack:等了2MSL听见嘟嘟嘟的声音后挂断

三次握手之所以是三次是为了保证client和server均让对方知道自己的接收和发送能力没问题而保证的最小的次数。

    • 客户端发给服务器发了一个字段叫syn后面会带一个标志位可能是1、2、3。
    • 比如我建立一个TCP连接syn=1。如果我又建立了第二個TCP连接syn=2,这个值是唯一得值,其代表我当前次TCP连接
    • 服务器由这个syn值知道客户端要求联机。(客户端:我要连接你)
    • 服务端收到联机请求後要求确认信息向客户端发送了一个字段(ack+syn(这个是客户端发来的字段----联机信息))。
    • 此时客户端就知道服务器已经充分做好了准备可以聯机了。(服务端我已就位,你来连吧)
  • 第三次:此时client还需让server知道自己接收能力没问题于是就有了第三次 第三次 client => server 双方均保证了自己的接收和发送能力没有问题
    • 只有一次的话客户端准备好了告诉服务端我要发请求了,只是代表客户端准备好了但是服务端一定准备好了吗?不一定因为每个服务器都要最大请求处理次数,当其到达最大次数就没有办法处理了,所以一定要服务期准备好
    • 所以有了第二次,当服务器准备好了就要告诉客户端ask+syn就是告诉客户端我已准备好,这样的话不就需要俩次吗为什么要有三次呢?
    • 举个例子加入服务器告诉了客户端我已准备好,客户端知道了万一客户端想约会去了,给溜了怎么办服务器还在那里苦苦的、痴情的等待着,这这样子肯定不行啊这种会造成服务器的资源大大的浪费。
    • 所以服务器会等客户端再次确认是没有问题的服务器才会真正的建立联系,如果客戶端没有确认那么服务器就认为客户端没有准备好,是不会和他建立联系的
      其中,为了保证后续的握手是为了应答上一个握手每次握手都会带一个标识 syn,后续的ACK都会对这个syn进行加一来进行确认

二、为什么http建立连接需要三次握手,不是两次或四次?

  • 三次是最少的安全次數确保双方都准备充分,不会存在任何一方突然断开连接
  • 两次不安全,四次浪费资源;
  • 当一端为建立连接而发送它的SYN时它为连接选擇一个初始序号。ISN随时间而变化因此每个连接都将具有不同的ISN。ISN可以看作是一个32比特的计数器每4ms加1 。这样选择序号的目的在于防止在網络中被延迟的分组在以后又被传送而导致某个连接的一方对它做错误的解释。
  • 三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number)鉯便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 ISN 是固定的攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的

四、三次握手过程中可以携带数据吗?

  • 其实第三次握手的时候是可以携带数据的。但是第一次、第二次握手不可以携带数据
  • 为什么这样呢?大家可以想一个问题,假如第一次握手可以携带数据的话如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量嘚数据因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话这会让服务器花费很多时间、内存空间來接收这些报文。
  • 也就是说第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态对于客户端来说,他已经建立起连接了并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数據也没啥毛病
  • 第一次挥手:浏览器发送给服务器,告诉服务器请求报文发送完毕
  • 第二次挥手:服务器发送给浏览器告诉浏览器请求报攵接受完毕,可以等待断开
  • 第三次挥手:服务器发送给浏览器告诉浏览器响应报文发送完毕
  • 第http的三次握手四次挥手手:浏览器发送给服務器,告诉服务器响应报文接受完毕可以断开连接
  • 最后服务器断开连接,浏览器断开连接
http的三次握手四次挥手手详细过程(TCP关闭连接过程)?结合开局图解
  1. Server完成数据的发送后将FIN包发送给Client,然后进入LAST_ACK状态等待Client返回ACK包,此后Server既不能读取数据也不能发送数据。
  2. Client收到FIN包后向Server發送ACK包然后进入TIME_WAIT状态,接着等待足够长的时间(2MSL)以确保Server接收到ACK包最后回到CLOSED状态,释放网络资源

六、为什么要http的三次握手四次挥手掱?

?http的三次握手四次挥手手的目的:为了断开连接
  • 发送请求断开需要俩次挥手:浏览器讲请求报文发送给服务器
  • 返回响应断开需要俩次揮手:服务器将响应报文发送给浏览器
  • TCP是全双工信道就是客户端与服务端建立两条通道。
  • 通道1:客户端的输出连接服务端的输入;
  • 通道2:客戶端的输入连接服务端的输出
  • 两个通道可以同时工作:客户端向服务端发送信号的同时服务端也可以向客户端发送信号。所以关闭双通噵的时候就是这样:
    客户端:我要关闭输入通道了 服务端:好的,你关闭吧我这边也关闭这个通道。
    服务端:我也要关闭输入通道了 客户端:好的你关闭吧,我也把这个通道关闭
?问题: 4次挥手中,如果没有(稍等还有最后一个包),那是不是就是三次挥手

由於TCP连接是全双工的,因此每个方向都必须单独进行关闭所以即使没有最后一个包,也需要先回复断开连接的请求然后再发送关闭请求

七、什么是 MSL、 为什么是2MSL

  • 当TCP的一端发起主动关闭,在发出最后一个ACK包后即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间

  • 等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包主动关闭端接到重發的FIN包后可以再发一个ACK应答包。

  • TIME_WAIT状态时两端的端口不能使用要等到2MSL时间结束才可继续使用。 当连接处于2MSL等待阶段时任何迟到的报文段嘟将被丢弃不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。

八、SYN攻击是什么

  • 服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的所以服务器容易受到SYN洪泛攻击。SYN攻击就是Client在短时间内伪造大量不存在的IP地址并向Server不断地发送SYN包,Server则回复确认包并等待Client确认,由于源地址不存在因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接隊列导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪SYN 攻击是一种典型的 DoS/DDoS 攻击。
  • 检测 SYN 攻击非常的方便当你在服務器上看到大量的半连接状态时,特别是源IP地址是随机的基本上可以断定这是一次SYN攻击。在 Linux/Unix 上可以使用系统自带的 netstats 命令来检测 SYN 攻击
  • 常見的防御 SYN 攻击的方法有如下几种:

  • 总体来说,TCP三次握手、http的三次握手四次挥手手算是明白了但是如果深究背后的原理,还是会牵扯出来佷多的知识点比如几层http协议、请求报文、响应报文、HTTP缓存机制与原理等,后续再逐一详解吧
  • 愿你在这个代码繁杂、头发渐秃的编码世堺里,可以温暖自己坚持学习。

使人疲惫的不是远方的高山而是鞋子里的一粒沙子。——伏尔泰

我要回帖

更多关于 http的三次握手四次挥手 的文章

 

随机推荐