计算机网络问题定位过程

一、TCP协议

TCP通信包括三个阶段——建立连接(3次握手)、数据传输、关闭连接(4次挥手)
计算机网络问题定位过程

需要注意是图中实线表示客户端,虚线表示服务端,图的起点是Closed状态。

“三次握手”流程如下:
1、服务器端被动打开Closed -> Listen,客户端请求与服务端建立连接Closed -> SYN_SEND;
2、服务端接收到连接SYN请求,回复SYN+ACK,状态由Listen -> SYN_RECV;
3、客户端收到SYN+ACK,并最后回复ACK,状态由 SYN_SEND -> ESTABLISHED;
4、服务端由到ACK,状态由 SYN_RECV -> ESTABLISHED。

“四次挥手”流程如下:
1、客户端主动发送FIN,表示客户端不在发送数据,但仍可接收数据,状态由ESTABLISHED -> FIN_WAIT_1;
2、服务端收到FIN后,回复ACK,表示收到客户端关闭,但仍可发送数据,服务端状态由ESTABLISHED -> CLOSE_WAIT;
3、客户端收到ACK后,状态由FIN_WAIT_1 -> FIN_WAIT_2
4、待服务端发送完数据,发送FIN,状态由CLOSE_WAIT -> LAST_ACK;
5、客户端收到FIN后,回复ACK,状态由FIN_WAIT_2 -> TIME_WAIT,此时两端实际都不在接收和发送数据;
6、客户端过2ML后自动关闭连接TIME_WAIT -> Closed,服务端收到ACK到关闭连接 LAST_ACK -> CLosed。

需要注意的是步骤4和5,也可能一起完成,这时客户端就直接从FIN_WAIT_1 -> TIME_WAIT,而服务端直接由ESTABLISHED -> LAST_ACK。

二、Linux平台抓取IP数据包

Linux平台抓包神器tcpdump,这个linux自带的工具,运行需要root权限。需要注意的是,tcpdump工作在网络层,抓取的是IP数据包。

Tcpdump常用的参数如下
-i:抓取哪个网卡,没有指定则用any;
src host:源IP
src port:源端口
dst host:目标IP
dst port: 目标端号
-X: 打印数据包
-w: 保存数据包

示例:抓取网卡1目标host 为127.0.0.1,port为7023的数据包,并打印。
sudo tcpdump -i eth1 dst host 127.0.0.1 port 2344 -X
抓取任意网卡host 为127.0.0.1,port为7023的数据包,并保存数据包到ip_pkg.txt
sudo tcpdump -i any host 127.0.0.1 port 2344 -w ip_pkg.txt
抓取任意网卡port为7023的数据包
sudo tcpdump -i any

计算机网络问题定位过程

三、IP数据包分析

使用第二节tcpdump抓取IP数据,并保存。在window平台使用wiresharp进行分析,非常方便。下图是抓取的TCP请求和回包的数据包情况。
计算机网络问题定位过程

“三次握手”过程:前三个数据包1-3为TCP连接过程,下文标号表示上图中NO
1:客户端100.116.164.90发送SYN,请求与服务端9.37.1.134建立连接,第一次握手;
2:服务端收到SYN,后回复SYN+ACK,第二次握手;
3:客户端ACK,第三握手。

数据传输过程:数据包4~12进行数据传输
4:客户端请求服务端,业务数据大小为172字节;
5:服务端ACK,ACK=173,即为4中接收数据大小+1;
6~7:服务器回包,业务数据大小为两个包之和 7300+7300=14600;
8:客户端ACK, ACK=14601,表示收到服务器端发送的6~7回包;
9~12:同样是服务器与客户端交换业务数据过程,不在赘述。

“四次挥手”过程:数据包13~15为TCP关闭连接过程
13:客户端发送FIN,请求与服务端关闭连接,第一次挥手;
14:服务端收到FIN后回复FIN+ACK,注意这里实际上把第二次挥手和第三次挥手合并到一起了;
15:客户端收到FIN,回复ACK,最后一次按手。