美文网首页三月听我说
HTTP三次握手连接示例

HTTP三次握手连接示例

作者: 黄建刚_三月 | 来源:发表于2018-08-05 15:12 被阅读19次

专业知识

HTTP 的三次握手是一个非常重要的面试和考试考点,但是今天早上看书上的一幅图和三段话将近看了半个小时,于是来总结一下。


三次握手图例

连接状态

  1. CLOSED:表示初始状态。
  2. LISTEN: 服务器端的某个SOCKET处于监听状态,可以接受连接了。
  3. SYN_SENT:表示客户端已发送 SYN 报文。
  4. SYN_RCVD:表示服务器接受到了 SYN 报文。
  5. ESTABLISHED:表示连接已经建立。

HTTP 的三次握手使用的是 TCP 协议,所以先看一下 TCP 的报文段首部,三次握手需要注意到的是用红线括起来的部分。

TCP 报文段头部

字段介绍

  • ACK 确认字段:在连接建立后所有传送的报文段 ACK 必须为 1 。
  • SYN 同步字段:连接建立时使用同步序号。
  • FIN 终止字段:FIN = 1 是表示释放一个连接。
  • 序号 seq :发送了多少被成功接受数据。
  • 确认号 ack:接受了多少数据。

注意点

ACK = 1 不携带数据不消耗序号。
SYN = 1 不能携带数据并且要消耗一个序号。

抓包示例

Wirshark 抓包

示例分析

192.168.1.11 为客户端 A,42.121.252.58 为服务器 B。

  1. 客户端请求连接发送 SYN 产生一个为 x = 0 的序号 seq 。
  2. 服务器接受连接,ACK = x + 1 = 1 并产生 y = 0 的序号 seq;发送 SYN ACK seq = 0 ack = 1 到客户端。
  3. 客户端发现服务器接受了连接请求返回了 ack,seq = x;同时接受服务器的请求 ack = y + 1 = 1。
  4. 因为上个传输,只传输了一个 ACK 没有数据,所以看第四条线 seq = 1,ack = 1。

收获:看 2 这个列表项,发送端的 seq 字段需要接收到服务器段的 ack 才会变化,这个时候 服务器 ack = 客户端 seq 。

所以我才会有下面对 seq 和 ack 的理解。

  • 序号 seq :发送了多少被成功接受数据。
  • 确认号 ack:接受了多少数据。

面试问题

为什么使用三次握手?
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误 ——谢希仁著《计算机网络》第四版
谢希仁版《计算机网络》中的例子是这样的,“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”主要目的防止server端一直等待,浪费资源。

观察 SYN 的含义:同部字段。如果客户端和服务器端都需要使用 SYN-ACK 机制同步一下的话,最少是需要 3 次握手的。另一方面服务器资源相对于客户端资源是更加重要一点。

参考文章

TCP 三次握手

TCP为什么需要3次握手与4次挥手

Wireshark基本介绍和学习TCP三次握手

相关文章

  • HTTP三次握手连接示例

    专业知识 HTTP 的三次握手是一个非常重要的面试和考试考点,但是今天早上看书上的一幅图和三段话将近看了半个小时,...

  • socket编程

    http://c.biancheng.net/cpp/socket/三次握手建立连接四次握手断开连接close函数...

  • TCP四次挥手过程

    TCP通过三次握手建立连接,通过四次挥手来释放连接,对于三次握手的过程之前学习的时候就记录过http://www....

  • 1.http和https的理解

    http底层是TCP建立连接会进行三次握手: 为什么需要三次握手,是为了保证传输的可靠性,三次握手可以验证客户端和...

  • 2018-06-26

    HTTP请求的三次握手,四次挥手 三次握手客户端发送一个带有SYN(建立连接)的TCP报文到服务器,这个三次握手的...

  • 2018-06-11(TCP三次握手、四次挥手)

    三次握手: 每一次TCP连接都需要三个阶段:连接建立、数据传送和连接释放。三次握手就发生在连接建立阶段。 三次握手...

  • TCP三次握手和四次挥手

    1、TCP三次握手 TCP建立连接需要进行“三次握手”: TCP三次握手过程描述如下: 客户端发送连接请求报文:S...

  • http请求分析 I axios

    http请求过程 域名解析 发起TCP的三次握手 建立TCP连接后发起 http 请求 服务器响应 http 请求...

  • TCP10问

    1.TCP建立连接时需要几次握手, 断开连接需要几次握手? TCP建立连接需要三次握手, 断开连接要四次握手。现有...

  • HTTP请求、Socket连接、TCP连接的关系

    OSI与TCP/IP结构模型 三次握手 当客户端发送一个http请求时,需要先建立TCP连接,即三次握手: 客户端...

网友评论

    本文标题:HTTP三次握手连接示例

    本文链接:https://www.haomeiwen.com/subject/zrybvftx.html