系列文章:
《Wireshark分析Netty建链过程( tcp三次握手、osi模型)》
1. osi模型简述
OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。如下图左边部分。在每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如源ip地址和目的ip地址等。
osi模型中,在下一层的角度看,当收到上一层的包时,全部会被认为是本层的数据,然后在本层中加上自己本层的首部,继续往下传递。一个数据包格式如下:
举一个例子,比如客户端应用程序A向远端服务器应用程序B发送“早上好”的数据,那么大致流程
是这样的:
- 应用
程序A把数据发送给下一层的TCP模块
。 - TCP模块属于传输层。
TCP在应用层数据的前端加上一个TCP首部
。TCP首部中包含源端口号和目标端口号等信息。然后将包发送给IP模块
。 - IP模块属于网络层。
IP将TCP传过来的TCP首部和TCP数据合起来当做自己的数据,并且在TCP首部的前面加上自己的IP首部
。IP首部包含了源ip地址和目的ip地址。然后,IP包将被发送给数据链路层,也就是以太网驱动程序
。 - 从IP传过来的包,对于以太网驱动程序来说不过就是数据。
给这些数据加上以太网首部,里面包含了源MAC地址和目的MAC地址
。然后再通过物理层把数据发送给目的MAC地址
。 - 服务器物理层接收到来自客户端的数据包时,
首先从以太网的包首部找到MAC地址,判断是否为发给自己的包,如果不是就丢弃,如果是就向上转移给IP模块解析
。 - IP模块收到IP包首部和后面的数据以后,判断包首部的目的ip地址与自己的ip地址是否匹配,如果匹配,就接收数据并传给TCP模块处理。
- TCP模块会检查端口号确定接收数据的应用程序是哪一个。
- 应用程序接收到数据包之后也会根据自己的规则判断做出一系列的处理。
通过上面例子大致的过程,可以体会到从上而下发包再到从下而上收包的过程。
2. tcp三次握手
3. 验证三次握手
我们通过netty的交互来验证三次握手。
步骤1. 使用RawCap.exe监听码流
使用该工具的原因是Wireshark无法捕获127.0.0.1的报文,详情请参考Wireshark无法捕获127.0.0.1的报文。
执行命令:D:\test>RawCap-old.exe 127.0.0.1 dumpfile.pcap
D:\test>RawCap-old.exe 127.0.0.1 dumpfile.pcap
Sniffing IP : 127.0.0.1
File : dumpfile.pcap
Packets : 2^C
步骤2. 发送码流
windows本地开启一个netty服务,并在命令行执行telnet localhost 8088
,netty服务端代码可以参考Netty入门官方例子解析(一)丢弃服务器
步骤3. 停止RawCap
按ctrl+c停止监听,并查看相应目录下的dumpfile.pcap文件
步骤4. 使用wireshark打开文件
设置过滤条件,排除无关的消息:
ip.src==127.0.0.1 and ip.dst==127.0.0.1
客户端通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答。
服务器发送ACK包确认应答,发送SYN包请求连接。
客户端针对SYN包发送ACK包确认应答。