|
|
一般地,只是单个的一个SYN,它表示的只是建立连接。当出现SYN和ACK可能同时为1,我们认为客户端与服务器建立了一个连接。而当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。 x/ F/ u1 ^6 g, p2 U! A. |0 q
; d. V3 W [3 t/ D: \/ @- ^8 d) h7 Z
Wireshark 抓包步骤
0 q' k$ c, q; m {+ ~! v% I首先根据域名获取对应的ip,终端输入 ping 域名
; \- o+ P( ?+ [ t+ U7 b% \' C( ~ Z, L _' C
小技巧 也可通过telnet查看端口是否开启telnet ip 端口: L) O+ a; h/ H! ~3 O9 U
) \2 d T) c ?0 K! T打开Wireshark,首页选择要抓取的通道(Wi-Fi,网卡等),然后设置过滤规则,点击右上角箭头配置过滤规则,或者点击某一条右键选中! ]4 { E G5 a% i9 F) s3 y
Apply as Filter,
7 }9 Y* ^3 z* G2 z' s6 x1 \ip.src==103.219.186.235 or ip.dst==103.219.186.235
( z) L6 R& C) E! B' @
; p) g, D: x+ R* Q/ i4 A/ Z& J$ t% v9 E' P; `4 l
TCP三次握手; F R; K. g q6 x- Z! T
6 J. v3 @4 J, H7 o5 J( M
9 h3 M# X; D' U* `7 b6 b' Z% e" {) o
第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;3 R5 ~* B: s$ z$ ~+ l! x
: ` R& `. u- A# k- L
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;
3 ~( d) p; k( T" D6 q5 K& X* t
- w, ^- v4 ^$ N 第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。# n( \" ?: p. ^- J M6 @
* g. _% S i3 n* ?
8 G3 l$ l( M/ C) ^
- P8 C. |0 T/ x9 w1 i% J. _
1. 客户端发送 SYN 报文 到服务器
' t" }, M8 z# e' s/ T6 l
7 u) f. V( K; M4 S( ^; b8 Z
( A9 E" g7 Z& K2. 服务器接收到后 回复 SYN + ACK 报文5 h5 ^! B {3 y7 \$ b; B" g6 ]
* m6 C8 K( [1 H; ]9 a8 r
' U4 a- Q( E C- |- b7 P) l3.客户端接收到服务端的 SYN+ACK 报文后,回复 ACK报文
; t- Y4 D+ Q; D: E" U
& j) a5 `& g' ?8 B4 i2 m注意:理论上,Syn 应该初始值是个随机数的,后面的要根据初始值增加 ,wireshark为了好区分从0开始的,可以自行设置显示原始Syn
" V6 O+ T/ G/ E8 `+ d" H; R4 N3 T$ \# S# d
TCP 四次挥手,简略分析; z3 p' v) ], Y4 T6 o, R
+ F% d0 s5 B4 h5 y2 V$ r
& ^, x- d) J5 |& [# |(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。! p8 N, J3 z- h1 l! o+ h
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。: J" u- S F" N1 Q' o2 W
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
( W, a5 ?" X: \& J/ Z0 t(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
! A; q8 H2 z7 [' z" R* H' q5 _
; \; k, ~ z1 n* U- ~: R抓包异常数据解读% T& Z' l8 b& u" y: l% _
1.[TCP Previous segment not captured]丢包
4 }1 t# e/ V, U3 O: T在TCP传输过程中,同一台主机发出的数据段应该是连续的,即后一个包的Seq号等于前一个包的Seq + Len(三次握手和四次挥手是例9 {/ A1 ~, w6 F4 c
外)当后Seq>前Seq +Len,就知道中间缺失了一段数据。+ W/ {" w+ b8 ]! {9 t
& b, p P+ |* l+ C, Q
4 o |. m# n. Q8 P2 o( A, t[TCP Out-of-Order] 乱序3 Y9 j1 t7 J6 G+ F
Wireshark在获取包序号26时发现seq=18981,而包序号25的数据包seq = 20441,所以wireshark认为数据包顺序错了2 h. H( [7 Q; _. }, r3 Q3 E1 @
( X+ k/ q/ `) |) q Z: C6 N/ u
2.[TCP Dup ACK x#y]. y& F% }: O7 h& u
当乱序或者丢包发生时,接收方会收到一些Seq号比期望值大的包。此时就会Ack就说我想获取seq=28852的数据包而你给了我其他包。
) T: X0 r$ w- l R% Q$ N5 Y8 m3 {8 N9 t/ A+ i9 b8 R* Q" A% [4 v- G
8 w z* k. z9 Q3 x
& r% I! y7 }; l1 U# u
3、[TCP Spurious Retransmission] 丢包重传; v# T2 t+ k8 j H
5 ]" q- v; s. P6 |- U
6 m* j B a* A% ]0 Q ?4、[TCP Fast Retransmission] 快速重传
( W' F" e* Q9 f, u& k4 m当发送方收到3个或以上[TCP Dup ACK],就意识到之前发的包可能丢了,于是快速重传它(这是RFC的规定)。6 D9 r% b* ~4 V' E. C
) j/ M( S0 k& j
& m- r1 f) S4 a: d/ E, |- e$ x
+ z- R7 d$ ]2 x' F) \' i
5、[TCP Retransmission] 超时重传* n) A7 P% E, h9 U6 Q+ G) Q9 I
如果一个包真的丢了,又没有后续包可以在接收方触发[Dup Ack],就不会快速重传,只能超时重传。" Q( i, ~ _1 J5 E
3 F0 T3 E( X2 i4 T2 R
% y! V3 _, {" g3 U" g) E2 `; S( h) H1 A8 i+ O$ N, J
6、几种TCP连接中出现RST的情况
: Z0 ?- m9 J4 {" y1.端口未打开
) R9 |7 j4 J+ ]1 z& r1 s服务器程序端口未打开而客户端来连接。这种情况是最为常见和好理解的一种了。去telnet一个未打开的TCP的端口可能会出现这种错误。7 Z# b6 V- {+ J; [ R. K0 h
$ [8 A2 y* ^- d& U: `, C4 ~
2. 请求超时
$ m/ X/ ~; y) Z D' K/ b. G0 u( g查看2次包的时间间隔7 D2 n! |% a9 G; V
+ t) M) Q- b# o- L9 v. p: Z3. 服务端关闭的socket
$ M$ [5 o3 x' h$ x$ p
, Y. u$ p9 `1 o+ q2 Z9 t4. 防护墙拒绝了请求
" J! s9 [- Q& k0 l+ C3 ?+ X5 S$ S- n" t/ N& g, T9 Z
5. 移动链路
4 K7 n- q& ]5 {& j# K2 p8 E$ P: ?+ ?, S: p1 C
移动网络下,国内是有5分钟后就回收信令,也就是IM产品,如果心跳>5分钟后服务器再给客户端发消息,就会收到rst。也要查移动网络下IM 保持<5min 心跳。
& v: @% K2 Y! s: `/ U) S `9 K
& n3 Q4 ^" H3 N; b6 J6. 负载等设备
1 ^+ z8 P2 h' e8 k' a; q 负载设备需要维护连接转发策略,长时间无流量,连接也会被清除,而且很多都不告诉两层机器,新的包过来时才通告rst。/ w3 S0 T7 v7 Y+ U* W, [* _
/ S, C* n& p% W1 r) y; }Apple push 服务也有这个问题,而且是不可预期的偶发性连接被rst;rst 前第一个消息write 是成功的,而第二条写才会告诉你连接被重置2 i- Q* `0 b+ O$ E
* a. m' T- v3 W( Y. u; }
7. 超过超时重传次数、网络暂时不可达
/ ^$ `4 A _$ r+ E& m5 p I; m5 { |
|