以下说明了日常开发中常见的网络问题的模拟方法、异常表现,及定位问题的方法,并提供了Linux网络请求命令nc、curl,防火墙命令iptables的使用说明。
1. 前言
相关内容如下:
Windows抓包与网络分析工具总结:https://blog.csdn.net/a82514921/article/details/104609924
Linux抓包与网络分析工具总结:https://blog.csdn.net/a82514921/article/details/104616502
Java程序网络连接分析方法总结:https://blog.csdn.net/a82514921/article/details/104616519
iptables模拟网络连接问题并分析:https://blog.csdn.net/a82514921/article/details/104616548
2. 问题分类
在开发过程中,经常发生的网络连接失败包括:连接拒绝、连接超时、读返回超时等,以下主要分析这些比较常见的异常。
3. Linux网络请求与防火墙命令
以下使用Linux版本为2.6.32-642.6.2.el6.x86_64。
3.1 nc命令
man nc的说明为“nc(或netcat)应用程序可对TCP或UDP进行处理,可以打开TCP连接,发送UDP数据包,监听任意TCP和UDP端口,进行端口扫描,以及处理IPv4和IPv6”。
nc命令可能没有预装,需要进行安装。
以下对下文需要使用的nc命令进行说明(使用代理等其他复杂功能未涉及)。
3.1.1 nc选项
l -k
-k选项只能与-l选项结合使用,使nc的当前连接完成后,保持监听,等待后续的连接。
当使用-l选项但不使用-k选项时,nc命令在接收到一次连接后会自动退出;当使用-l选项且使用-k选项时,nc命令在接收到连接后不会自动退出,会继续处理连接。
l -l
使nc监听并处理接入的连接,而不是向远程主机发起连接。
该选项无法与“-p”“-s”“-z”选项同时使用,-w选项指定的超时时间会被忽略。
l -n
不对任何地址、主机名或端口进行DNS或服务查找。
当指定-n选项后,会导致无法使用域名或主机名,localhost也无法使用。
l -u
使用UDP替代默认的TCP协议。
l -v
使nc打印更详细的输出。
当nc连接远程主机失败时,默认无提示;当指定-v选项后,会打印错误信息。
当nc监听端口时,连接成功后默认不会显示客户端连接信息;指定-v选项后,会显示客户端连接信息。
l -w timeout
指定超时时间,如果连接和标准输入的空闲时间超过超时时间,连接会被静默关闭。
-w选项对-l选项没有效果,即无论是否使用-w选项,nc都会永远监听等待连接。
超时时间默认不存在。
l -z
指定nc只是扫描监听,不向其发送数据。
使用nc连接远程主机成功时,当指定-z选项时,nc会自动退出,并显示连接成功的信息。
nc连接成功时,若不指定-z选项,nc不会自动退出,可在标准输入输入数据,回车后会发送给服务器;若服务器使用nc -l监听,会显示客户端发送的数据,在服务器的nc标准输入输入数据并回车后,在客户端的nc也会显示数据。
l port[s]
使用nc连接远程主机时,可以只指定一个端口,也可指定某个范围的端口,当指定端口范围时,格式为“nn-mm”,如“80-90”,nc会对每个端口进行扫描,并输出结果。
3.1.2 nc使用示例
执行“nc -l 8080”,使nc监听8080端口,当有连接建立成功后,nc会自动退出。若指定了-v选项,会显示客户端连接信息,如“Connection from [客户端IP] port 8080 [tcp/webcache] accepted”。
执行“nc -l 8080 -k”,使nc监听8080端口,当有连接建立成功后,nc不会自动退出,会继续监听等待连接,且会显示客户端发送的数据。
执行“nc localhost 8080”,会连接本机的8080端口。若连接成功,可以在标准输入输入数据,回车后发送给服务器;若连接失败(端口未监听),默认自动退出且无输出,若指定了-v选项,会自动退出并提示“nc: connect to localhost port 8080 (tcp) failed: Connection refused”。
执行“nc localhost 8080 -z”,会连接本机的8080端口。若连接成功,会自动退出并显示“Connection to localhost 8080 port [tcp/webcache] succeeded!”;若连接失败(端口未监听),默认自动退出且无输出,若指定了-v选项,会自动退出并提示“nc: connect to localhost port 8080 (tcp) failed: Connection refused”。
3.2 curl命令
man curl的说明为“curl是用于从服务器获取或向服务器传输数据的工具,支持的协议包括HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、DICT、TELNET、LDAP或文件。该命令被设计为不需要用户交互。curl提供了大量有用的技巧,如代理支持,用户身份验证,FTP上传,HTTP POST,SSL连接,Cookies,文件传输及恢复等”。
以下对下文需要使用的curl命令进行说明(指定请求方法、请求数据、HTTP头,发送HTTPS请求,使用代理,keey-alive配置,使用其他协议等其他复杂功能未涉及)。
3.2.1 curl选项
curl命令的使用方式为“curl [options] [URL...]”。
l --connect-timeout <seconds>
设置连接服务器时的超时时间秒数,只限制连接阶段的超时时间,当curl已完成连接后,该选项不再生效。
l -m/--max-time <seconds>
设置整个操作的超时时间秒数。
3.2.2 curl示例
执行“curl http://127.0.0.1:12345 --connect-timeout 2”,访问http://127.0.0.1:12345,连接超时时间设置为2秒。当连接超时时,提示为“curl: (28) connect() timed out!”。
执行“curl http://127.0.0.1:12345 -m 2”,访问http://127.0.0.1:12345,操作总超时时间设置为2秒。当连接成功但访问请求超时时,提示为“curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received”。
3.3 iptables命令
man iptables的说明为“用于IPv4包过滤及NAT的管理工具。用于在Linux内核中设置、维护及检查IPv4数据包过滤规则表。可以定义几个不同的表,每个表包含许多内置链,也可以包含用户定义的链。每个链都是可以匹配一系列数据包的规则列表。每个规则都指定如何处理匹配的数据包”。
执行iptables需要root权限。
iptables可以作为软件防火墙使用,以下对下文需要使用的iptables命令进行说明(其他复杂功能未介绍),使用的iptables版本为1.4.7。
3.3.1 iptables targets
防火墙规则指定了数据包和目标的处理条件。如果数据包不匹配,则使用规则链中的下一个进行检查;如果数据包匹配,则使用对应的目标进行处理。目标可以为用户定义的链名称,也可以特殊值ACCEPT、DROP、QUEUE或RETURN之一。
l ACCEPT
ACCEPT代表允许数据包通过。
l DROP
DROP代表丢弃数据包。
3.3.2 iptables targets扩展
iptables还可以使用扩展的target模块,在标准发布中包含了很多targets扩展,以下仅对REJECT进行说明。
l REJECT
REJECT用于在匹配的数据包返回中发送错误数据包,REJECT是一个终止target,会终止规则遍历。REJECT仅能用于INPUT、FORWARD及OUTPUT链中,以及仅从这些链调用的用户定义链。
“--reject-with type”选项可以控制返回的错误数据包的性质,type可为icmp-net-unreachable、icmp-host-unreach-able、icmp-port-unreachable、icmp-proto-unreachable、icmp-net-prohibited、icmp-host-prohibited或icmp-admin-prohib-ited。默认值为port-unreachable。
tcp-reset选项仅可用于TCP协议,会发送TCP RST包。
3.3.3 iptables表
“-t, --table table”选项用于指定命令作用的数据包匹配的表。如果内核配置了自动模块加载,则会尝试加载该表的相应模块(如果该表尚不存在)。
iptables中具有以下表:
l filter
filter是iptables使用的默认的表(如果没有指定-t选项)。
filter表包含以下的内置的链:
内置链名 | 作用 |
INPUT | 对应发往本地套接字的数据包 |
FORWARD | 对应通过本机路由的数据包 |
OUTPUT | 对应本地生成的数据包 |
l nat
略。
l mangle
略。
l raw
略。
3.3.4 iptables命令
l -A, --append chain rule-specification
在指定的链的末尾附加一条或多条规则。
l -D, --delete chain rule-specification/-D, --delete chain rulenum
从指定的链中删除一条或多条规则。
l -I, --insert chain [rulenum] rule-specification
在指定的链使用指定的规则编号插入一条或多条规则。若指定的规则编号(rulenum)为1,则在链的头部插入。当未指定规则编号时,默认使用1。
l -L, --list [chain]
列出指定的链中的全部规则。若未指定链,则列出所有链中的规则。和iptables的其他命令类似,该命令使用于指定的表(默认为filter)。
l -F, --flush [chain]
清空指定的链,若未指定链,则清空指定表的全部链。该命令与逐个删除全部的规则效果相同。
3.3.5 iptables参数
l [!] -p, --protocol protocol
指定规则或需要检查的包对应的协议。可为tcp、udp、udplite、icmp、esp、ah、sctp或all中的一个,也可以是数值。允许使用/etc/protocols文件中的协议名称。数字0等同于all,协议all将与所有协议匹配,并作为该参数的默认值。
“!”可以使参数含义反转,如“! -p tcp”,代表不是tcp协议则匹配。
“! -p tcp ”会导致--dport等参数无法使用。
l [!] -s, --source address[/mask][,...]
指定源地址。地址可以是网络名称、主机名、网络IP地址(带掩码)或IP地址。规则在被提交给内核前,主机名仅被解析一次。不建议使用远程查询(如DNS)对任何名称进行解析。掩码可以是网络掩码,或通过数字指定网络掩码左侧的1的数量。--src是当前参数的别名。
“!”可以使参数含义反转,如“! -s 127.0.0.1”,代表不是“127.0.0.1”的源地址则匹配。
l [!] -d, --destination address[/mask][,...]
指定目标地址。与-s参数用法类似。--dst是当前参数的别名。
“!”可以使参数含义反转,如“! -d 127.0.0.1”,代表不是“127.0.0.1”的目标地址则匹配。
l -j, --jump target
指定规则的target,即当包匹配规则时需要执行什么操作。target可以是用户定义的链(不是此规则所在的链),一个特殊的可以立即决定数据包操作的内置target,或扩展的target。如果规则中省略了此选项(并且未使用-g,跳转到指定的链),则规则对匹配到的包将不会有效果,但规则上的计数器将递增。
当-j参数不指定target时,不会对匹配的数据包产生影响,可用于观察满足规则的包数量与大小。
l [!] -i, --in-interface name
指定包被接收时通过的接口名称(只对通过INPUT、FORWARD和PREROUTING链的包有效)。当接口名称以“+”结尾时,则以指定名称开头接口会被匹配。当未指定该参数时,所有的接口都会被匹配。
-i参数只能与“-I INPUT”同时使用(都是指定接收数据包的规则),不能与“-I OUTPUT”同时使用。
“!”可以使参数含义反转,如“! -i eth0”,代表包被接收时通过的接口不是“eth0”则匹配。
l [!] -o, --out-interface name
指定包被发送时通过的接口名称(只对通过INPUT、FORWARD和POSTROUTING链的包有效)。当接口名称以“+”结尾时,则以指定名称开头接口会被匹配。当未指定该参数时,所有的接口都会被匹配。
-i参数只能与“-I OUTPUT”同时使用(都是指定发送数据包的规则),不能与“-I INPUT”同时使用。
“!”可以使参数含义反转,如“! -o eth0”,代表包被发送时通过的接口不是“eth0”则匹配。
3.3.6 iptables其他选项
l -v, --verbose
输出详细信息。该选项使“-L, --list”命令显示接口名称、规则选项(如果存在)和TOS掩码。数据包和字节计数器也被列出,后缀分别为“K”“M”或“G”,分别为1000、1,000,000和1,000,000,000的倍数(-x选项可以改变该输出格式)。对于附加、插入、删除和替换操作,该选项会使对应规则的详细信息被打印。
l -n, --numeric
使用数字格式的输出。IP地址与端口号会以数字形式打印,可以避免DNS解析。在默认情况下(未指定当前选项时),iptables会尝试以主机或、网络名称或服务名的形式进行展示。
例如执行“iptables -I INPUT -s localhost”命令添加规则。
执行“iptables -L -v”命令查看规则,可以看到IP地址显示为主机名形式。
Chain INPUT (policy ACCEPT 285 packets, 57158 bytes) pkts bytes target prot opt in out source destination 0 0 all -- any any localhost anywhere ... |
执行“iptables -L -v -n”命令查看规则,可以看到IP地址为数字形式。
Chain INPUT (policy ACCEPT 8195 packets, 11M bytes) pkts bytes target prot opt in out source destination 0 0 all -- * * 127.0.0.1 0.0.0.0/0 ... |
l -x, --exact
展开数字。显示数据包与字节计数器的精确的值,而不是显示四舍五入的K(1000)、M(1000K)或G(1000M)。该选项只能在使用-L命令时使用。
以下为示例:
执行“iptables -L -v -x”命令,可以看到数字展示为精确的值。
Chain INPUT (policy ACCEPT 79027 packets, 56436626 bytes) pkts bytes target prot opt in out source destination 0 0 all -- any any localhost anywhere
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 55000 packets, 13694656 bytes) pkts bytes target prot opt in out source destination |
执行“iptables -L -v”命令,可以看到数字展示为以K、M、G为单位的形式。
Chain INPUT (policy ACCEPT 79027 packets, 56M bytes) pkts bytes target prot opt in out source destination 0 0 all -- any any localhost anywhere
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 55001 packets, 14M bytes) pkts bytes target prot opt in out source destination |
l --line-numbers
当使用-L命令时,可以指定当前选项,可以根据规则在链中的位置,在每个规则的开头显示行号。
3.3.7 iptables扩展匹配
iptables可以使用扩展的包匹配模块。
包匹配模块有两种加载方式:
一是隐式加载,指定了-p或--protocol选项;
二是指定了-m或--match选项,后续指定匹配模块名称。
当使用了包匹配模块后,可以使用很多额外的命令选项,由指定的模块决定。
iptables的基础包中包含了addrtype、ah、cluster、comment、connbytes、connlimit、connmark、conntrack、dccp、dscp、ecn、esp、hashlimit、helper、icmp、iprange、length、limit、mac、mark、multiport、owner、physdev、pkttype、policy、quota、rateest、realm、recent、sctp、set、socket、state、statistic、string、tcp、tcpmss、time、tos、ttl、u32、udp、unclean等模块。
以上模式的命令大多可以通过“!”使命令含义反转。
当指定了“-p tcp”或“--protocol tcp”时,可以使用tcp扩展,支持以下选项:
l [!] --source-port,--sport port[:port]
指定源端口或源端口范围。可为服务名称或端口号,也可以指定端口范围,格式为“first:last”。当未指定first端口时,默认使用0;当当未指定last端口时,默认使用65535。
示例:“sudo iptables -I INPUT -p tcp --dport 12344:12346”。
l [!] --destination-port,--dport port[:port]
指定目标端口或源端口范围。
l [!] --tcp-flags mask comp
可以匹配TCP数据包的标志位,略。
[!] --syn
l 可以匹配TCP数据包的标志位,略。
3.3.8 iptables默认规则
某些版本的Linux系统在安装后存在默认的iptables规则。
如CentOS 6.9/RedHat 6.5等版本安装后存在默认iptables规则,仅允许访问本机的22端口。
3.3.9 iptables使用示例
执行“iptables -L -v”,查看iptables规则,如下所示。pkts与bytes,分别展示匹配规则的包数量,及字节数
Chain INPUT (policy ACCEPT 9451 packets, 3109K bytes) pkts bytes target prot opt in out source destination 9438 3109K tcp -- any any anywhere anywhere
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 9614 packets, 4601K bytes) pkts bytes target prot opt in out source destination |
执行“iptables -I INPUT -p tcp --dport 12345 -i eth0 -j REJECT”,设置对于接收的TCP协议数据包,若目标端口为12345,且网络接口为eth0时则拒绝。
会导致本机可以访问本机的12345端口,经过eth0网络接口的其他机器不可访问本机的12345端口。
执行“iptables -I INPUT -p tcp --dport 12345 -i lo -j REJECT”,设置对于接收的TCP协议数据包,若目标端口为12345,且网络接口为回环接口lo时则拒绝。
会导致本机不可访问本机的12345端口,经过eth0网络接口的其他机器可以访问本机的12345端口。
执行“iptables -I OUTPUT -p tcp --sport 12345 -o eth0 -j REJECT”,设置对于发送的TCP协议数据包,若源端口为12345,且网络接口为eth0时则拒绝。
会导致本机可以访问本机的12345端口,经过eth0网络接口的其他机器不可访问本机的12345端口。
执行“iptables -I OUTPUT -p tcp --sport 12345 -o lo -j REJECT”,设置对于发送的TCP协议数据包,若源端口为12345,且网络接口为回环接口lo时则拒绝。
会导致本机不可以访问本机的12345端口,经过eth0网络接口的其他机器可访问本机的12345端口。
执行“iptables -I INPUT -p tcp -s 192.168.0.0/16 --dport 12345 -j DROP”,使用掩码的IP地址,设置对于接收的TCP协议数据包,若源地址为192.168网段的IP,且目标端口为12345时则拒绝。
执行“iptables -I INPUT -p tcp -s 192.168.0.1 --dport 12345 ! -i eth0 -j ACCEPT”,设置对于接收的TCP协议数据包,若源地址为192.168.0.1,且目标端口为12345,且网络接口不是eth0时则允许。
执行“iptables -I OUTPUT ! -p tcp -d 192.168.0.1 -i eth0 -j ACCEPT”,设置对于发送的数据包,如果协议不是TCP,且目标地址为192.168.0.1,且网络接口为eth0时则允许。
执行“iptables -I OUTPUT -p tcp ! -s 192.168.0.1 --dport 12345 -i eth0 -j ACCEPT”,设置对于发送的TCP协议数据包,若源地址不是192.168.0.1,且目标端口为12345,且网络接口为eth0时则允许。
3.3.10 ip6tables
对于IPv6的数据包,当需要使用iptables相关功能时,需要使用ip6tables命令。ip6tables是IPv6的包过滤管理工具。
4. 模拟异常
4.1 模拟连接拒绝
4.1.1 模拟方法
访问存在的IP的未监听的端口 ,可以出现连接拒绝异常。
假设服务器IP为192.168.0.1,监听端口为12345。在客户端执行iptables命令设置以下规则,使客户端连接请求被拒绝,可以出现连接拒绝异常。
iptables -I OUTPUT -p tcp -d 192.168.0.1 --dport 12345 -j REJECT |
假设客户端IP为192.168.0.1,服务器监听端口为12345。在服务器执行iptables命令设置以下规则,使客户端连接请求被拒绝,可以出现连接拒绝异常。
iptables -I INPUT -p tcp -s 192.168.0.1 --dport 12345 -j REJECT |
4.1.2 模拟结果
模拟连接被拒绝,使用以下命令进行连接,结果如下:
l telnet
执行“telnet 192.168.0.1 12345”,结果如下:
Trying 192.168.0.1... telnet: connect to address 192.168.0.1: Connection refused |
l nc
执行“nc -z -v 192.168.0.1 12345”,结果如下:
nc: connect to 192.168.0.1 port 12345 (tcp) failed: Connection refused |
l curl
执行“curl 192.168.0.1:12345”,结果如下:
curl: (7) couldn't connect to host |
4.2 模拟连接超时
4.2.1 模拟方法
访问不存在IP的端口 ,可以出现连接超时异常。
假设服务器IP为192.168.0.1,监听端口为12345。在客户端执行iptables命令设置以下规则,使客户端连接请求被丢弃,可以出现连接超时异常。
iptables -I OUTPUT -p tcp -d 192.168.0.1 --dport 12345 -j DROP |
假设客户端IP为192.168.0.1,服务器监听端口为12345。在服务器执行iptables命令设置以下规则,使客户端连接请求被丢弃,可以出现连接超时异常。
iptables -I INPUT -p tcp -s 192.168.0.1 --dport 12345 -j DROP |
4.2.2 模拟结果
模拟连接被拒绝,使用以下命令进行连接,结果如下:
l telnet
执行“telnet 192.168.0.1 12345”,一直显示“Trying 192.168.0.1...”。
l nc
执行“nc -z -w 2 -v 192.168.0.1 12345”,设置连接超时时间为2秒,结果如下:
nc: connect to 192.168.0.1 port 12345 (tcp) timed out: Operation now in progress |
l curl
执行“curl --connect-timeout 2 192.168.0.1:12345”,设置连接超时时间为2秒,结果如下:
curl: (28) connect() timed out! |
4.3 模拟读返回超时
4.3.1 模拟方法
自定义Socket服务器,可通过以下方式之一可使客户端连接后出现读返回超时异常:
l 只调用bind方法进行监听,不调用accept方法创建Socket对象;
l accept方法创建Socket对象,不向客户端返回数据,且不调用创建的Socket对象的close方法;
l accept方法创建Socket对象,等待超过客户端的超时时间后再向其返回数据。
假设自定义服务器的IP为192.168.0.1,端口为12345。
4.3.2 模拟结果
l curl
执行“curl -m 2 192.168.0.1:12345”,设置连接超时时间为2秒,结果如下:
curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received |
5. 应用程序网络异常现象
5.1 Java程序网络异常
5.1.1 连接拒绝
使用Java的Socket类连接服务器,若连接被拒绝,异常信息为“java.net.ConnectException: Connection refused: connect”。
5.1.2 连接超时
使用Java的Socket类连接服务器,若当连接超时,异常信息为“java.net.SocketTimeoutException: connect timed out”。
5.1.3 读返回超时
使用Java的Socket类连接服务器,若读返回超时,异常信息为“java.net.SocketTimeoutException: Read timed out”。
5.2 HttpClient网络异常
以下使用HttpClient为4.3.6。
5.2.1 连接拒绝
使用HttpClient连接服务器,若连接被拒绝,异常信息为“org.apache.http.conn.HttpHostConnectException: Connect to 192.168.0.1:12345 [/192.168.0.1] failed: Connection refused: connect”。
5.2.2 连接超时
使用HttpClient连接服务器,若连接超时,异常信息为“org.apache.http.conn.ConnectTimeoutException: Connect to 192.168.0.1:12345 [/192.168.0.1] failed: connect timed out”。
5.2.3 读返回超时
使用HttpClient连接服务器,若读返回超时,异常信息为“java.net.SocketTimeoutException: Read timed out”。
5.3 Jedis访问Redis服务器失败
5.3.1 异常模拟方法
通过iptables设置规则,模拟异常场景,可以使应用访问Redis服务器失败。
Jedis连接Redis服务器失败时,可能导致应用初始化失败,因此可能需要在应用正常启动后,
5.3.2 异常模拟结果
当Jedis访问Redis服务器失败时,异常信息为“redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool”,Caused by异常信息为“redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out”。
6. TCP协议说明
6.1 三次握手说明
TCP协议说明见https://tools.ietf.org/html/rfc793。
建立连接的三次握手过程的示意图为“Basic 3-Way Handshake for Connection Synchronization Figure 7.”,如下所示:
TCP A TCP B
1. CLOSED LISTEN
2. SYN-SENT --> <SEQ=100><CTL=SYN> --> SYN-RECEIVED
3. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED
4. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK> --> ESTABLISHED
5. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK><DATA> --> ESTABLISHED |
6.2 RST的说明
关于RST的说明为“A control bit (reset), occupying no sequence space, indicating that the receiver should delete the connection without further interaction.”。
RST为控制位(复位),不占用序列空间,表示接收方应删除连接且无需进一步交互。
7. TCP数据包分析
以下数据包均在客户端捕获,客户端操作系统为Linux 2.6.32-642.6.2.el6.x86_64,捕获数据包工具为tcpdump。
7.1 正常情况下的TCP连接
正常情况下的TCP连接数据包如下所示,与TCP协议说明建立连接的三次握手过程一致。
7.2 TCP连接拒绝
7.2.1 访问未监听的端口
当客户端访问存在的IP未监听的端口时,连接被拒绝。
数据包如下所示,可以看到客户端向服务器发送SYN后,服务器返回了RST,ACK,使客户端中断连接,与TCP协议说明的RST标志作用相符。
7.2.2 客户端连接请求被拒绝
在客户端使用iptables设置规则,使客户端连接请求被拒绝,在客户端使用tcpdump捕获数据包,未捕获到对应数据包。
7.2.3 服务器处理连接请求被拒绝
在服务器设置iptables规则,使其处理连接请求被拒绝,客户端连接会被拒绝。
数据包如下所示,可以看到客户端向服务器发送SYN后,客户端未接收到服务器的返回。
7.3 TCP连接超时
7.3.1 访问不存在IP的端口
当客户端访问不存在的IP的端口时,连接超时(访问不存在的IP:123.123.123.123)。
数据包如下所示,可以看到客户端向服务器发送SYN后,未接收到服务器的返回,经过一段时间后进行重发。
7.3.2 客户端连接请求被丢弃
在客户端使用iptables设置规则,使客户端连接请求被丢弃,在客户端使用tcpdump捕获数据包,未捕获到对应数据包。
7.3.3 服务器处理连接请求被丢弃
在服务器设置iptables规则,使其处理连接请求被丢弃,客户端连接会超时。
数据包如下所示,可以看到客户端向服务器发送SYN后,未接收到服务器的返回,经过一段时间后进行重发。