通信协议Network

使用TCPDUMP研究TCP头部结构

2019-06-11  本文已影响0人  awker

《Linux高性能服务器编程》读书笔记

为了理解TCP头部中每个字段的定义,从10.31.90.106执行telnet命令,并用tcpdump抓取这个过程中telnet客户端和telnet服务器程序之间交换的数据包。
一、执行tcpdump抓包
# tcpdump -ntx -i lo

二、在另一个终端输入telnet命令查询

# telnet 127.0.0.1
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused

三、查看tcpdump抓到的包(开启了-x选项,使之输出数据包的二进制码)

# tcpdump -ntx -i lo
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
IP 127.0.0.1.57777 > 127.0.0.1.telnet: Flags [S], seq 3611485706, win 32792, options [mss 16396,sackOK,TS val 1023622707 ecr 0,nop,wscale 7], length 0
 0x0000:  4510 003c d839 4000 4006 6470 7f00 0001
 0x0010:  7f00 0001  e1b1 0017 d742 e60a 0000 0000
 0x0020:  a002 8018 7540 0000 0204 400c 0402 080a
 0x0030:  3d03 3e33 0000 0000 0103 0307
IP 127.0.0.1.telnet > 127.0.0.1.57777: Flags [R.], seq 0, ack 3611485707, win 0, length 0
 0x0000:  4510 0028 0000 4000 4006 3cbe 7f00 0001
 0x0010:  7f00 0001 0017 e1b1 0000 0000 d742 e60b
 0x0020:  5014 0000 12b7 0000

四、分析TCP包头(数据包共包含60字节,其中前20字节是IP头部,后40字节是TCP头部,不包含应用程序数据(length值为0))

  1. Flags [S],表示该TCP报文段包含SYN标志,因此它是一个同步报文段。(SYN ACK FIN RST PSH URG)
  2. seq 3611485706,从127.0.0.1.57777 > 127.0.0.1.telnet这个方向上的第一个TCP报文段,所以这个序号值也就是此次通信过程中该传输方向的ISN值。
  3. win 32792,win是接收通告窗口的大小。因为这是一个同步报文段,所以win值反映的是实际的接收通告窗口大小。?
  4. options,options是TCP选项,其具体内容列在方括号中。
  5. mss 16396,是发送端(客户端)通告的最大报文段长度。(通过ifconfig命令查看lo接口的MTU为16436字节,所以TCP报文段的MSS为16396(16436字节的MTU-20字节的IP头-20字节TCP头部)字节)
  6. sackOK,表示发送端支持并同意使用SACK选项。
  7. TS val 1023622707,是发送端的时间戳
  8. ecr 0,是时间戳回显应答(因为这是一次TCP通信的第一个TCP报文段,所以它针对对方的时间戳的应答为0(尚未收到对方的时间戳)
  9. nop,空操作选项
  10. wscale 7,发送端使用的窗口扩大因子为7
  11. length 0,表示数据部分长度为0字节
  12. TCP头部,从 0xe1b10x0307(前20字节是IP头部,0x4510 到 0x0001)
 0x0010:  7f00 0001  e1b1 0017 d742 e60a 0000 0000
 0x0020:  a002 8018 7540 0000 0204 400c 0402 080a
 0x0030:  3d03 3e33 0000 0000 0103 0307
十六进制数 二进制表示 十进制表示 TCP头部信息
0xe1b1 01110000110110000 57777 源端口号
0x0017 00010111 23 目的源口号
0xd742e60a 3611485706 序号
0x00000000 0 确认号
0xa 00000100 10 TCP头部长度为10个32位(40字节)
0x002 00000002 设置了SYN标志
0x8018 32792 接收窗口大小
0x7540 30016 头部校验和
0x0000 没设置URG标志,所以紧急指针值无意义
0x0204 0x02-->2,0x04-->4 最大报文段长度选项的kind值和length值(kind=2,length=4)
0x400c 16396 最大报文段长度(Maximum segment size)
0x0402 0x04-->4,0x02-->2 允许SACK选项(kind=4,length=2)
0x080a 0x08-->8,0x0a-->10 时间戳选项的kind值和length值(kind=8,length=10)
0x3d033e33 1023622707 时间戳
0x00000000 0 回显应答时间戳
0x01 0x01-->1 空操作选项(nop,kind=1)
0x0303 0x03-->3,0x03-->3 窗口扩大因子选项的kind值和length值(kind=3,kind=3)
0x07 7 窗口扩大因子为7

对比下图,说明TCP头部结构


上一篇 下一篇

猜你喜欢

热点阅读