三次握手难题

三次握手难题

我正在尝试理解三向握手,但很难理解这在现实世界中是如何应用的。例如,如果我使用 Mozilla Firefox 等网络浏览器浏览网站 www.superuser.com,我认为会发生以下情况

  1. 我启动 Firefox,并为应用程序分配一个随机进程标识符。假设我启动时页面为空白,那么就会发生以下情况。

  2. 现在,如果我浏览 www.superuser.com,我的电脑就会通过发送 SYN 数据包来启动与服务器的联系。

  3. 服务器通过发送 ACK 数据包和自己的 SYN 数据包来响应请求

  4. 我的计算机以 ACK 数据包响应并建立连接。

现在的混乱,

  1. established 到底是什么意思?例如,如果我随后浏览 www.superuser.com 上的另一个页面,三次握手是否会重复?

  2. 我的PC什么时候发送FIN标志,服务器什么时候用自己的FIN数据包进行响应?

  3. 我理解应用程序在向服务器发出请求时可以有多个线程,这是否意味着每个线程都有自己的三次握手?这些是彼此独立的吗?

  4. FIN_WAIT各个状态代表什么意思?

  5. 服务器是否可以在未由客户端发起的情况下结束连接,还是始终必须由客户端发起?

答案1

established 到底是什么意思?例如,如果我要浏览到www.superuser.com那么三次握手会重复发生吗?

“已建立”意味着三次握手已经完成,并且连接可以传输数据(直到关闭)。

请求数取决于协议。在 HTTP 1.0 中,每个连接仅发出一个请求 –TCP 握手、HTTP 请求、HTTP 回复、TCP 关闭握手。为了检索样式表或图像,必须建立更多连接(可能同时建立多个连接)。

在 HTTP 1.1 中,允许持久连接,其中连接在初始请求后保持打开(空闲),并且如果浏览器需要加载更多资源(图像,其他页面),它会通过相同的连接发送更多请求。

其他协议通常通过单个连接进行长时间对话。而 FTP 除了使用主“控制”连接外,还使用多个短暂的“数据”连接。

我的PC什么时候发送FIN标志,服务器什么时候用自己的FIN数据包进行响应?

当你的浏览器决定关闭连接或者“挂断”时,你的计算机会发送一个 FIN 数据包,服务器会用 FIN ACK 回复它,你的计算机也会用 ACK 回复。

我理解应用程序在向服务器发出请求时可以有多个线程,这是否意味着每个线程都有自己的三次握手?这些是彼此独立的吗?

线程无关紧要。唯一的概念是TCP 连接. 每个单独的连接都有单独的握手。

每个线程都可以建立多种的连接;多个线程可能共享一个连接;甚至多个进程在某些情况下可以共享连接。

FIN_WAIT各个状态代表什么意思?

  1. 客户端处于 ESTABLISHED 状态 → 服务器发送 FIN → 客户端处于 FIN_WAIT1 状态
  2. 服务器处于 ESTABLISHED 状态 → 服务器收到 FIN → 服务器处于 CLOSE_WAIT 状态
  3. ...我承认,我不知道。(有人可以随意编辑。我找到了这张图表。

服务器是否可以在未由客户端发起的情况下结束连接,还是始终必须由客户端发起?

连接可以由任意一端关闭。如果 HTTP 守护进程关闭了它,它将以相同的方式工作,但方向相反 - 服务器将发送 FIN,而您的计算机将回复 FIN ACK...


TCP 指定于RFC 793。 这维基百科上有关 TCP 的文章解释协议握手如何完成。

答案2

  1. 表示建立了 TCP 连接(双工连接)

  2. 当不再需要连接时(某些浏览器和服务器会暂时保持连接,请参阅 http 连接标头)

  3. 每个 TCP 连接都是独立的,并且在建立连接时已完成自己的握手

  4. FIN_WAIT_1 表示已发送 FIN,但尚未确认 FIN_WAIT_2 表示已确认,但另一端尚未 FIN

  5. 当任何一端不再有任何内容可发送时,都可以终止连接

相关内容