我正在尝试理解三向握手,但很难理解这在现实世界中是如何应用的。例如,如果我使用 Mozilla Firefox 等网络浏览器浏览网站 www.superuser.com,我认为会发生以下情况
我启动 Firefox,并为应用程序分配一个随机进程标识符。假设我启动时页面为空白,那么就会发生以下情况。
现在,如果我浏览 www.superuser.com,我的电脑就会通过发送 SYN 数据包来启动与服务器的联系。
服务器通过发送 ACK 数据包和自己的 SYN 数据包来响应请求
我的计算机以 ACK 数据包响应并建立连接。
现在的混乱,
established 到底是什么意思?例如,如果我随后浏览 www.superuser.com 上的另一个页面,三次握手是否会重复?
我的PC什么时候发送FIN标志,服务器什么时候用自己的FIN数据包进行响应?
我理解应用程序在向服务器发出请求时可以有多个线程,这是否意味着每个线程都有自己的三次握手?这些是彼此独立的吗?
FIN_WAIT各个状态代表什么意思?
服务器是否可以在未由客户端发起的情况下结束连接,还是始终必须由客户端发起?
答案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各个状态代表什么意思?
- 客户端处于 ESTABLISHED 状态 → 服务器发送 FIN → 客户端处于 FIN_WAIT1 状态
- 服务器处于 ESTABLISHED 状态 → 服务器收到 FIN → 服务器处于 CLOSE_WAIT 状态
- ...我承认,我不知道。(有人可以随意编辑。我找到了这张图表。)
服务器是否可以在未由客户端发起的情况下结束连接,还是始终必须由客户端发起?
连接可以由任意一端关闭。如果 HTTP 守护进程关闭了它,它将以相同的方式工作,但方向相反 - 服务器将发送 FIN,而您的计算机将回复 FIN ACK...
TCP 指定于RFC 793。 这维基百科上有关 TCP 的文章解释协议握手如何完成。
答案2
表示建立了 TCP 连接(双工连接)
当不再需要连接时(某些浏览器和服务器会暂时保持连接,请参阅 http 连接标头)
每个 TCP 连接都是独立的,并且在建立连接时已完成自己的握手
FIN_WAIT_1 表示已发送 FIN,但尚未确认 FIN_WAIT_2 表示已确认,但另一端尚未 FIN
当任何一端不再有任何内容可发送时,都可以终止连接