【网络排查】TCP连接都是用TCP协议沟通的吗?
TCP 连接都是用 TCP 协议沟通的吗?
一般来说 TCP 连接是标准的 TCP 三次握手完成的:
- 客户端发送 SYN;
- 服务端收到 SYN 后,回复 SYN+ACK;
- 客户端收到 SYN+ACK 后,回复 ACK。
这里面 SYN 会在两端各发送一次,表示“我准备好了,可以开始连接了”。ACK 也是两端各发送了一次,表示“我知道你准备好了,我们开始通信吧”。
这里我们可以看到实际上是4个报文。但发了3次,显然服务端的 SYN 和 ACK 是合并在一起发送的,就节省了一次发送。这个在英文里叫 Piggybacking(搭顺风车)。
如果服务端不想接受这次握手,它会怎么做呢?可能会出现这么几种情况:
- 不搭理这次连接,就当什么都没收到,什么都没发生。这种行为,也可以说是“装聋作哑”。
- 给予回复,明确拒绝。相当于有人伸手过来想握手,你一巴掌拍掉,真的是非常刚了
第一种情况,因为服务端做了“静默丢包”,也就是虽然收到了 SYN,但是它直接丢弃了,也不给客户端回复任何消息。这也导致了一个问题,就是客户端无法分清楚这个 SYN 到底是下面哪种情况:
- 在网络上丢失了,服务端收不到,自然不会有回复;
- 对端收到了但没回,就是刚才说的“静默丢包”;
- 对端收到了也回了,但这个回包在网络中丢了。
那么,从客户端的角度,对于 SYN 包发出去之后迟迟没有回应的情况,它的策略是做重试,而且不止一次。
当不是静默丢包的情况下,如果我们直接拒绝连接会发生什么?
抓出来的数据包是这样的
很意外,居然对端回复了一个 ICMP 消息:Destination unreachable (Port unreachable)。这还不是最意外的,我们选中这个报文,进一步看它的详情,可能会更惊讶:TCP 握手拒绝这个事,竟然可以是 ICMP 报文来达成的。“握手过程用 TCP 协议做沟通
TCP 握手拒绝这个事,竟然可以是 ICMP 报文来达成的。“握手过程用 TCP 协议做沟通
一般来说 TCP 连接是标准的 TCP 三次握手完成的:客户端发送 SYN;服务端收到 SYN 后,回复 SYN+ACK;客户端收到 SYN+ACK 后,回复 ACK。
碎片化时间学习和你一起终身学习