我试图了解 linux 服务/进程涉及哪些 tcp 3 向握手。例如谁发送 SYN 请求的拒绝标志 [R.]。
示例:端口 8088 正在侦听,并且 8089 已打开。在两个端口上发出连接请求后,tcpdump 输出如下。
对于8089:
$ sudo tcpdump -i any -nn port 8088 or port 8089
04:23:12.260621 IP 192.168.112.129.52298 > 192.168.112.129.8089: Flags [S], seq 300539809, win 43690, options [mss 65495,sackOK,TS val 19840756 ecr 0,nop,wscale 7], length 0
04:23:12.260637 IP 192.168.112.129.8089 > 192.168.112.129.52298: Flags [R.], seq 0, ack 300539810, win 0, length 0
对于8088:
$ sudo tcpdump -i any -nn port 8088 or port 8089
04:23:21.680070 IP 192.168.112.129.42814 > 192.168.112.129.8088: Flags [S], seq 670408355, win 43690, options [mss 65495,sackOK,TS val 19850176 ecr 0,nop,wscale 7], length 0
04:23:21.680087 IP 192.168.112.129.8088 > 192.168.112.129.42814: Flags [S.], seq 1185731197, ack 670408356, win 43690, options [mss 65495,sackOK,TS val 19850176 ecr 19850176,nop,wscale 7], length 0
04:23:21.680098 IP 192.168.112.129.42814 > 192.168.112.129.8088: Flags [.], ack 1, win 342, options [nop,nop,TS val 19850176 ecr 19850176], length 0
那么这里哪个 Linux 服务发送 [R.] 8089 和 [S.] SYN-ACK 8088?还有数据包如何到达监听器,流量是多少?添加防火墙规则(使用 iptables)以在 8089 上丢弃数据包时,流程会怎样?
提前致谢 :)
答案1
TCP 数据包中的标志不由服务和进程直接管理。
通常,开发人员使用标准 POSIX 接口来开发网络功能:socket()
、connect()
、listen()
、bind()
、accept()
等...
Linux 内核是这些调用的主要接收者,它:
将资源分配给服务(
socket()
例如,在调用时),并且如果资源已在使用中(例如:bind()
使用已使用的地址/端口对),则会向调用进程返回错误相应的错误。管理真正的 TCP 堆栈内容,即开发人员调用时的 3 次握手
connect()
,或者如果没有服务绑定到请求的地址/端口对(或者如果服务拒绝连接),则返回 RST从外部接收数据包,并将其内容转发到适当的进程(已经完成
bind()
或connect()
来自地址/端口的进程,并且实际上正在相关套接字上调用recv()
或。read()
请注意,在进入该过程之前,会触发防火墙以确保允许网络流。因此,即使您有一个服务在 TCP/8000 上侦听,如果您的防火墙不允许连接到它,那么您将得到:
- A
RST
如果 iptables 策略或规则执行 aREJECT
。 - 如果 iptables 策略或规则执行 则超时
IGNORE
。