|
|
一般地,只是单个的一个SYN,它表示的只是建立连接。当出现SYN和ACK可能同时为1,我们认为客户端与服务器建立了一个连接。而当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。4 C. F9 x8 z# m! O+ S3 A' S9 K
; S! ~5 j' R: b) u) OWireshark 抓包步骤
0 |$ P' J/ E% U+ c7 l; d首先根据域名获取对应的ip,终端输入 ping 域名( S, G4 a7 D& G, N/ x* A
4 d8 f; C5 f8 P& y小技巧 也可通过telnet查看端口是否开启telnet ip 端口
6 L1 |" ~6 f: J: @
: |$ E# h! W% Z% K打开Wireshark,首页选择要抓取的通道(Wi-Fi,网卡等),然后设置过滤规则,点击右上角箭头配置过滤规则,或者点击某一条右键选中
) U' @8 e" E* ^9 i NApply as Filter,
* |% z+ n/ g6 P6 Cip.src==103.219.186.235 or ip.dst==103.219.186.235
& [6 ~ K/ Z3 ]& L
+ I0 B' B- j, G$ ~! Q; Y- W, j1 b& a3 V+ o0 S
TCP三次握手
1 V% T' d4 m, M/ r2 \
" N/ }. h0 V/ C0 f/ J; h$ L
; o0 i5 A" }. h5 G+ @: W第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
3 L" j* k# i% j+ H$ P$ ?% s% m% X2 b6 {. K) k! ~; L
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;- r- ~* z) z8 p" I2 n) K
8 K! @5 c" J+ ?3 _1 T! X2 T
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
& s6 y5 q1 ^4 x$ {+ \, F) {8 s$ i$ M z+ _$ u
' h# Q" y5 h7 S, H3 b' C4 |1 ]1 B Y
1. 客户端发送 SYN 报文 到服务器, k w! L" J) K+ y$ T1 O3 [
8 @4 ~' ?% F* I' r7 L; W$ {+ Y% Z* o/ y- @1 a
2. 服务器接收到后 回复 SYN + ACK 报文
+ E+ `( L1 I, V/ l& ^) ]0 Y- H# c, D' E4 I2 L: M" L
# H; j2 q. a6 [. F R3.客户端接收到服务端的 SYN+ACK 报文后,回复 ACK报文
d4 v4 v" @) s* `% {8 |% o0 h# \0 }6 \7 n; P* X7 O* H
注意:理论上,Syn 应该初始值是个随机数的,后面的要根据初始值增加 ,wireshark为了好区分从0开始的,可以自行设置显示原始Syn
6 H+ d- N1 Z6 Z9 }5 N# j" z; w
! x& ^. L" s- _2 j& _TCP 四次挥手,简略分析1 b c& p) N4 }+ `; n
9 J% g% }1 C) q4 O3 e
! F" \) ?. D Q, u- p& R(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。9 D0 \' _$ h w1 R
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
/ ~2 o C/ t! y/ X( K/ w(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
4 N, [1 B4 c: A! G(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。6 [, Q, L6 ?$ k$ J7 T$ \
. O1 n8 |- q5 E) S3 L+ H
抓包异常数据解读6 o# l) ^% O9 V4 w8 [3 @1 l
1.[TCP Previous segment not captured]丢包8 H' J+ \- V! Z/ t: @# I
在TCP传输过程中,同一台主机发出的数据段应该是连续的,即后一个包的Seq号等于前一个包的Seq + Len(三次握手和四次挥手是例
8 m0 \: p* V. K. c外)当后Seq>前Seq +Len,就知道中间缺失了一段数据。
+ k) u/ Z& I% t, _ ?
# j+ E6 G/ _; ?: B6 K% s# K" d7 e; S% t9 v5 E
[TCP Out-of-Order] 乱序2 r0 e. l: I# z1 d
Wireshark在获取包序号26时发现seq=18981,而包序号25的数据包seq = 20441,所以wireshark认为数据包顺序错了5 S2 q; j, a& |: v: R% Q6 R2 x/ J
' B; {3 {1 ]7 n, F L8 j1 N- t# o2.[TCP Dup ACK x#y]
* K/ X+ w) g7 l4 J3 }6 u0 i1 f当乱序或者丢包发生时,接收方会收到一些Seq号比期望值大的包。此时就会Ack就说我想获取seq=28852的数据包而你给了我其他包。2 f- ~' P& } \3 S1 h- y
7 t" e/ @; ?! d9 ]+ O' J- k0 `
5 H7 W8 B6 e Z- E. e: G$ h
( ~0 C1 N8 }( i: u- H! W3、[TCP Spurious Retransmission] 丢包重传
9 r9 M4 U" |! f U$ B8 s
+ B+ Q3 ?1 U# {1 e* Z, w" [
( ]- p- H' w, W0 L5 P# u; z5 F4、[TCP Fast Retransmission] 快速重传
) x, Q. A" e9 s. [9 v& S& X; x- ?当发送方收到3个或以上[TCP Dup ACK],就意识到之前发的包可能丢了,于是快速重传它(这是RFC的规定)。0 ]* K, {, X7 G; Q' L# ]! T) u- W
6 D# a) r& i+ J( H
/ C4 Z0 R5 y* ^' H
4 D1 m* |/ B, ?$ O) }8 |5、[TCP Retransmission] 超时重传
# u9 J1 u- C* u( x3 Y& c1 N如果一个包真的丢了,又没有后续包可以在接收方触发[Dup Ack],就不会快速重传,只能超时重传。! O# J" R7 D6 [- q
# c5 y; M+ m3 e) Y+ Q7 v7 I
5 ]) H3 H% S2 \6 q! t" U4 b, c8 \" S1 F; r. O
6、几种TCP连接中出现RST的情况
5 u; K, Q+ i5 x: u' y1.端口未打开6 l& ~$ k8 s& R; ?/ M, k( [
服务器程序端口未打开而客户端来连接。这种情况是最为常见和好理解的一种了。去telnet一个未打开的TCP的端口可能会出现这种错误。( G5 \/ a7 _- @- v
8 R' C; p$ C' n. y2. 请求超时
! c) K+ S3 q) c4 G7 d/ E查看2次包的时间间隔2 l* i& S, n8 N2 z K1 A
$ O% D `4 G* |2 `- b6 f
3. 服务端关闭的socket
7 U4 x7 ?7 D$ U# P. I
# }! |5 z: M/ W4. 防护墙拒绝了请求 i; Q" ?" T- x0 ]0 n+ Y2 A4 e
! o, A! d9 f$ N) E; r: D
5. 移动链路: x8 V* l3 W% P9 e1 F" V' G2 k
, J/ H) `' _3 W" B [8 i9 }
移动网络下,国内是有5分钟后就回收信令,也就是IM产品,如果心跳>5分钟后服务器再给客户端发消息,就会收到rst。也要查移动网络下IM 保持<5min 心跳。
3 [- `- X# b( F2 v8 m/ a
" ^4 f a( S- ]$ P6. 负载等设备2 K' A I9 ~8 O9 l. `( o
负载设备需要维护连接转发策略,长时间无流量,连接也会被清除,而且很多都不告诉两层机器,新的包过来时才通告rst。! C8 m8 x) w- F* D) o6 j
8 W0 @# M: c3 Q1 T
Apple push 服务也有这个问题,而且是不可预期的偶发性连接被rst;rst 前第一个消息write 是成功的,而第二条写才会告诉你连接被重置* r' l2 H% q# V
5 p+ b( x& T- m5 r% u% G0 S7. 超过超时重传次数、网络暂时不可达
+ s' e; ^) y# r0 ?" Q1 r |
|