在这里不得不再吐槽下国内整个IT粗糙浮躁,度娘下来的中文文档几尽抄袭~google下来的文档英文文档质量远高于国内中文文档.

IP数据包结构

逐字节解包剖析TCP握手&挥手_java

TCP数据包结构

逐字节解包剖析TCP握手&挥手_java_02

敲黑板,重点来了!这里要考!
tcpdump抓出来的每行数据的每个字段分别是什么意思呢?

  • tcpdump需root权限

tcpdump -x -i eth1 ip host 58.246.240.122 or 58.246.3.218
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes

//tcpdump软件参数输出 用-v 或 –vv可以提到更详细的输出 监听在eth1端口,ethernet网络,最大可抓取65535 bytes

19:49:24.580582 IP 58.246.240.122.53784 -> 112.124.45.184.httpFlags [S]seq 592474217, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK]length 0

//第一次握手 //SERVER: TCP LISTEN状态 CLIENT:TCP LISTEN状态 //19:49:24(秒).580582(微秒) IP src.port -> dst.port: Flags[s],seq序列号,win属性,tcp 选项[~~~]长度为0,即没有数据传输 //19:49:24.580582,源ip为58.246.240.122的53784端口向112.124.45.184的(80端口)http服务发起SYN请求,序列号为592474217,并告诉http服务器我将发送的最大请求字节数为8192,没有数据输出 //这是一个空包,只包括IP头和TCP头

  • 0x0000:  4500 0034 35a9 4000 3406 4776 3af6 f07a

解释
45004: IP版本号IPV4;  5: IP包头长度,5个32字节;  00: TOS (000 0000 0)前三个BIT优先权,现已忽略;4 bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用, 均为0表示一般服务;最后1BIT未用
0034总长度,48字节
35a9包唯一标识
4000标志字段,和片偏移,用于分片
340634 - TTL(128) Time To Live  06 – tcp协议"
4776MAC
3af6f07aSrc ip,会c的同学可以用inet_ntoa函数转转看
  • 0x0010:  707c 2db8 d218 0050 2350 7069 0000 0000

解释
707c 2db8Det ip
2db8源端口 转换为10进制为 53784
0050目的端口 转换为10进制为 80
2350 7069包序列号,转换为10进制为 592474217
0000 0000确认序号,0,未设置ACK,确认序号无效
  • 0x0020:  8002 2000 1f4f 0000 0204 05b4 0103 0302

解释
8002TCP包头长度,标志位。(1000 000000 000010)前4bitTCP长度8个32BIT,中间6bit保留,后6bit为标志位(URG, ACK,PSH, RST, SYN, FIN),可以看出设置了倒数第二位,SYN位
2000窗口大小 ,10进制 8192
1f4f校验和,覆盖了整个的 T C P报文段: T C P首部和T C P数据
0000紧急指针, 只有当URG标志置1时紧急指针才有效
020405b4 0103  0302    选项字段,8个字节
  • 0x0030:  0101 0402

解释
0101 0402用户数据
19:49:24.580613 IP 112.124.45.184.http -> 58.246.240.122.53784Flags [S.]seq 3820056301, ack 592474218, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7]length 0

//第二次握手 //19:49:24.580613 112.124.45.184 webserver确认收到序列号为592474217并对序列号+1=592474218,并发出序列号为3820056301的请求

0x0000:  4500 0034 0000 4000 4006 711f 707c 2db8
0x0010:  3af6 f07a 0050 d218 e3b1 6eed 2350 706a
0x0020:  8012 3908 b391 0000 0204 05b4 0101 0402
0x0030:  0103 0307

19:49:24.639829 IP 58.246.240.122.53784 -> 112.124.45.184.httpFlags [.]ack 1, win 16425, length 0

//第三次握手,到此经典的三次握手结束 //19:49:24.639829 58.246.240.122从53784端口向112.124.45.184回应一个ack,length=0,没有任何数据传输

0x0000:  4500 0028 35ab 4000 3406 4780 3af6 f07a
0x0010:  707c 2db8 d218 0050 2350 706a e3b1 6eee
0x0020:  5010 4029 ed42 0000
19:49:24.640197 IP 58.246.240.122.53784 -> 112.124.45.184.httpFlags 
[P.]seq 1:541ack 1, win 16425, length 540

//19:49:24.640197 client回应一条ack并PUSH一条长为540字节的请求,seq由1-->541,win窗口大小为16425

0x0000:  4500 0244 35ac 4000 3406 4563 3af6 f07a
0x0010:  7072db8 d218 0050 2350 706a e3b1 6eee
0x0020:  5018 4029 81e2 0000 4745 5420 2f69 6e64
0x0030:  6578 2e70 6870 2048 5454 502f 312310d
0x0040:  0a41 6363 6570 7432061 7070 6c69 6361
0x0050:  7469 6f6e 2f78 2d6d 732d 6170 7066963
0x0060:  6174 696f 6e22069 6d61 6765 2f6a 7065
0x0070:  6722061 7070 6c69 6361 7469 6f6e 2f78
0x0080:  616d 6c2b 786d 6c2c 2069 6d61 6765 2f67
0x0090:  6966 2c20 696d 6167 652f 7067065 672c
0x00a0:  2061 7070 6c69 6361 7469 6f6e 2f78 2d6d
0x00b0:  732d 7862 6170 2c20 6170 7066963 6174
0x00c0:  696f 6e2f 7666426d73 2d65 7863 656c
0x00d0:  2c20 6170 7066963 6174 696f 6e2f 766e
0x00e0:  6426d73 2d70 6f77 6572 706f 696742c
0x00f0:  2061 7070 6c69 6361 7469 6f6e 2f6d 7377
0x0100:  6f72 6422022f2a 0d0a 4163 6365 7074
0x0110:  2d4c 6166775 6167 653207682d 434e
0x0120:  0d0a 5573 6572 2d41 6765 6e74 3a20 4d6f
0x0130:  7a69 6c6c 612f 3423020 2863 6f6d 7061
0x0140:  7469 626653204d 5349 4520 382303b
0x0150:  2057 696646f 7773 2045420 362313b
0x0160:  2057 4f57 3634 3b20 5472 6964 656742f
0x0170:  3423032053 4c43 4332 3b20 2e44554
0x0180:  2043 4c52 2032 2e30 2e35 3037 3237 3b20
0x0190:  2e44554 2043 4c52 2033 2e35 2e33 3037
0x01a0:  3239 3b20 2e44554 2043 4c52 2033 2e30
0x01b0:  2e33 3037 3239 3b20 4d65 6469 6120 4365
0x01c0:  6e74 6572 2050 4320 3623032024e45
0x01d0:  5434 2e30 4332024e45 5434 2e30 453b
0x01e0:  2049 6e66 6f50 6174 6823329 0d0a 4163
0x01f0:  6365 7074 2d45 6e63 6f64 6966732067
0x0200:  7a69 7022064 6566 6c61 7465 0d0a 486f
0x0210:  7374 3a20 6f70 7469 6d69 7a65 2e70 6961
0x0220:  6f74 6169 2e63 6f6d 0d0a 436f 6e66563
0x0230:  7469 6f6e 3a20 4b65 6570 2d41 6c69 7665
0x0240:  0d0a 0d0a

19:49:24.640212 IP 112.124.45.184.http -> 58.246.240.122.53784: Flags [.], ack 541, win 123, length 0

//server回应一条seq号为541的确认信息,win 窗口大小为123,无数据传输

0x0000:  4500 0028 fc98 4000 4006 7492 707c 2db8
0x0010:  3af6 f07a 0050 d218 e3b1 6eee 2350 7286
0x0020:  5010 007b 2ad5 0000

19:49:24.640863 IP 112.124.45.184.http -> 58.246.240.122.53784Flags [P.]seq 1:241ack 541, win 123, length 240

//server应答client,并向client PUSH一条长度为240字节的请求

0x0000:  4500 0118 fc99 4000 4006 73a1 7072db8
0x0010:  3af6 f07a 0050 d218 e3b1 6eee 2350 7286
0x0020:  5018 007b caaf 0000 4854 5450 2f31 2e31
0x0030:  2032 3030 204f 4b0d 0a53 6572 7665 723a
0x0040:  2066769 6e78 0d0a 4461 7465 3a20 5361
0x0050:  7422031 3720 4a61 6e20 3230 3135 2031
0x0060:  3133439 3a32 3420 474d 540d 0a43 6f6e
0x0070:  7465 6e74 2d54 7970 6532074 6578 742f
0x0080:  6874 6d6c 0d0a 5472 6167366 6572 2d45
0x0090:  6e63 6f64 6966732063 6875 6e66564
0x00a0:  0d0a 436f 6e66563 7469 6f6e 3a20 6b65
0x00b0:  6570 2d61 6c69 7665 0d0a 582d 506f 7765
0x00c0:  7265 642d 4279 3a20 5048 502f 352342e
0x00d0:  3336 0d0a 436f 6e74 656742d 456636f
0x00e0:  6469 6e67 3a20 6776970 0d0a 0d0a 3166
0x00f0:  0d0a 1f8b 0800 0000 0000 0003 f34b 2cc9
0x0100:  2c4b 5508 f008 5004 0020f61 e60b 0000
0x0110:  000d 0a30 0d0a 0d0a
19:49:24.899320 IP 112.124.45.184.http -> 58.246.240.122.53784: Flags [P.], seq 1:241, ack 541, win 123, length 240

//这里不确认什么原因重复PUSH了一次数据

0x0000:  4500 0118 fc9a 4000 4006 73a0 7072db8
0x0010:  3af6 f07a 0050 d218 e3b1 6eee 2350 7286
0x0020:  5018 007b caaf 0000 4854 5450 2f31 2e31
0x0030:  2032 3030 204f 4b0d 0a53 6572 7665 723a
0x0040:  2066769 6e78 0d0a 4461 7465 3a20 5361
0x0050:  7422031 3720 4a61 6e20 3230 3135 2031
0x0060:  3133439 3a32 3420 474d 540d 0a43 6f6e
0x0070:  7465 6e74 2d54 7970 6532074 6578 742f
0x0080:  6874 6d6c 0d0a 5472 6167366 6572 2d45
0x0090:  6e63 6f64 6966732063 6875 6e66564
0x00a0:  0d0a 436f 6e66563 7469 6f6e 3a20 6b65
0x00b0:  6570 2d61 6c69 7665 0d0a 582d 506f 7765
0x00c0:  7265 642d 4279 3a20 5048 502f 352342e
0x00d0:  3336 0d0a 436f 6e74 656742d 456636f
0x00e0:  6469 6e67 3a20 6776970 0d0a 0d0a 3166
0x00f0:  0d0a 1f8b 0800 0000 0000 0003 f34b 2cc9
0x0100:  2c4b 5508 f008 5004 0020f61 e60b 0000
0x0110:  000d 0a30 0d0a 0d0a
19:49:24.902210 IP 58.246.240.122.53784 -> 112.124.45.184.http: Flags [.], ack 241, win 16365, length 0

//client回应server一个确认请求表示数据收到

0x0000:  4500 0028 35b3 4000 3406 4778 3af6 f07a
0x0010:  707c 2db8 d218 0050 2350 7286 e3b1 6fde
0x0020:  5010 3fed ea72 0000
19:49:24.956904 IP 58.246.240.122.53784 -> 112.124.45.184.httpFlags [.]ack 241, win 16365, options [nop,nop,sack 1 {1:241}]length 0

//因为server不明原因的多回复了一条应答,client这里也再次回复server ack请求

0x0000:  4500 0034 35b4 4000 3406 476b 3af6 f07a
0x0010:  707c 2db8 d218 0050 2350 7286 e3b1 6fde
0x0020:  8010 3fed 0e2b 0000 0101 050a e3b1 6eee
0x0030:  e3b1 6fde
19:49:26.682065 IP 112.124.45.184.http -> 58.246.240.122.53594Flags [F.]seq 2650770207, ack 934373505, win 123, length 0

//第一次挥手 //server回复应答信息并发起seq为2650770207的FIN信息 //server端TCP的状态改变为TIME_WAIT状态

0x0000:  4500 0028 608c 4000 4006 109f 707c 2db8
0x0010:  3af6 f07a 0050 d15a 9dff 8b1f 37b1 6881
0x0020:  5011 007b 4ab7 0000
19:49:26.736671 IP 58.246.240.122.53594 -> 112.124.45.184.httpFlags [.]ack 1, win 16365, length 0

//第二次挥手 //client回复应答信息

0x0000:  4500 0028 35bc 4000 3406 476f 3af6 f07a
0x0010:  707c 2db8 d15a 0050 37b1 6881 9dff 8b20
0x0020:  5010 3fed 0b45 0000
19:49:54.529939 IP 112.124.45.184.http -> 58.246.240.122.53716Flags [F.]seq 1644452284, ack 3778482049, win 123, length 0

//server第二次发起一条FIN断开请求的需求

0x0000:  4500 0028 0faf 4000 4006 617c 707c 2db8
0x0010:  3af6 f07a 0050 d1d4 6204 59bc e137 0f81
0x0020:  5011 007b 6715 0000
19:49:54.586707 IP 58.246.240.122.53716 -> 112.124.45.184.httpFlags [.]ack 1, win 16365, length 0

//client应答表示收到FIN的断开信息

0x0000:  4500 0028 3667 4000 3406 46c4 3af6 f07a
0x0010:  707c 2db8 d1d4 0050 e137 0f81 6204 59bd
0x0020:  5010 3fed 27a3 0000
19:50:09.641734 IP 112.124.45.184.http -> 58.246.240.122.53784Flags [F.]seq 241, ack 541, win 123, length 0

//server第三次发起一条FIN断开请求的需求

0x0000:  4500 0028 fc9b 4000 4006 748f 707c 2db8
0x0010:  3af6 f07a 0050 d218 e3b1 6fde 2350 7286
0x0020:  5011 007b 29e4 0000
19:50:09.699854 IP 58.246.240.122.53784 -> 112.124.45.184.httpFlags [.]ack 242, win 16365, length 0

//client第二次应答表示收到FIN的断开信息

0x0000:  4500 0028 36f6 4000 3406 4635 3af6 f07a
0x0010:  707c 2db8 d218 0050 2350 7286 e3b1 6fdf
0x0020:  5010 3fed ea71 0000
19:50:09.702809 IP 58.246.240.122.53784 -> 112.124.45.184.httpFlags [R.]seq 541, ack 242, win 0, length 0

//client表示领会到server的意思,发送RESET次应答表示收到RESET并立即主动关闭请求

0x0000:  4500 0028 36f7 4000 3406 4634 3af6 f07a
0x0010:  707c 2db8 d218 0050 2350 7286 e3b1 6fdf
0x0020:  5014 0000 2a5b 0000

//本次的请求4次挥手不大正常,在本次请求中会发现client没有发送FIN请求在收到多次服务器请求后就直接关闭连接发送RESET

  • 一次正常的挥手数据请求应该是这样的,

逐字节解包剖析TCP握手&挥手_java_03