TCP协议在网络分层模型中处于传输层,许多的应用层协议(例如HTTP,SMTP等)是基于传输层TCP协议工作的,TCP协议提供了面向连接的可靠的传输服务,理解TCP协议的工作原理对于工作和面试是非常有帮助的。
TCP连接三次握手
为了简便,使用nc命令来模拟服务器和客户端来建立连接的三次握手过程。
首先在linux上打开一个终端,键入nc -v -l 127.0.0.1 22222命令,该命令的作用是让该主机监听本机的22222端口,充当服务器功能。
接下来再打开一个终端使用tcpdump命令来监控三次握手过程
tcpdump -i any port '22222' -XX -nn -vv
然后再打开一个终端,键入nc -v 127.0.0.1 2222来模拟客户端功能,与服务器建立连接。
观察tcpdump窗口的变化
客户端和服务器进行了三次握手过程,建立了连接。
下面来分析协议细节。
分析一下第一次握手的细节
0x0000: 0000 0304 0006 0000 0000 0000 0000 0800 ................
0x0010: 4500 003c 8aa5 4000 4006 b214 7f00 0001 E..<..@.@.......
0x0020: 7f00 0001 b5c8 56ce 246e 2eea 0000 0000 ......V.$n......
0x0030: a002 aaaa fe30 0000 0204 ffd7 0402 080a .....0..........
0x0040: b675 a44f 0000 0000 0103 0307 0000 0000 .u.O............
0x0050: 0000 0000 0000 0000 0000 0000 ............
前32个字节是其他层协议的部分,我们暂时不研究,从第33个字节开始就是TCP的头部信息了
十六进制 | 十进制 | TCP头部信息 |
0xb5c8 | 46536 | 16位源端口号 |
0x56ce | 22222 | 16位目的端口号 |
0x246e2eea | 611200746 | 32位序号 |
0x00000000 | 0 | 32位确认号 |
0xa | 10 | 4位头部长度,10个4字节,最多60字节 |
0x002 | 2 | 前6位保留位,后六位标志位,设置了SYN标志 |
0xaaaa | 43690 | 16位接受窗口大小 |
0xfe30 | 头部校验和 | |
0x0000 | 16位紧急指针 | |
0x0204 | 最大报文段长度选项的kind值和length值 | |
0xffd7 | 65495 | 最大报文段长度 |
0x0402 | 允许SACK选项 | |
0x080a | 时间戳选项的kind值length值 | |
0xb675a44f | 时间戳 | |
0x00000000 | 回显应答时间戳 | |
0x01 | 空操作选项 | |
0x0303 | 窗口扩大因子选项的kind值length值 | |
0x06 | 6 | 窗口扩大因子为6 |
SYN置1,随机生成序列号,这样40个字节长度的TCP头部就列出来了。接下来看第二次握手的细节。
0x0000: 0000 0304 0006 0000 0000 0000 0000 0800 ................
0x0010: 4500 003c 0000 4000 4006 3cba 7f00 0001 E..<..@.@.<.....
0x0020: 7f00 0001 56ce b5c8 20f5 1