############################# TCP三次握手 ###############################php
Source Port&Destination Port(來源端口&目標端口):咱們知道IP數據包的傳送方式主要是
經過IP地址鏈接兩端,可是到底這個鏈接的通道是鏈接到哪裏去?沒錯,就是鏈接到Port上,
例如一個www.sina.com有開發www服務器,這表示新浪網址的主機須要啓動一個可讓Client
端鏈接的端口,這個端口就是Port,一樣的,客戶端想要鏈接到新浪網站時,就須要在Client
主機上面啓動一個Port,這樣兩個主機才能利用這條通道來傳遞數據包數據,這個目標與來源
Port的記錄,能夠說是TCP數據包上最重要的參數nginx
Sequence Number(數據包序號):因爲TCP數據包須要帶入IP數據包當中,因此若是TCP數據太
大時(大於IP數據包的允許程度),就得要進行分段。這個Sequence Number就是記錄每一個數據
包的序號,可讓接收端從新將TCP的數據組合起來。服務器
Acknowledge Number(迴應序號):爲了確認主機端確實有收到咱們Client端所送出的數據包
數據,咱們Client端固然但願可以收到主機方面的響應,那就是這個Acknowledge Number的用
途。當Client端收到這個確認碼時,就可以肯定先前傳遞的數據包已經被正確的收下了網絡
Data Offset(信息補償):在圖中倒數第2行有個Options字段,這個Options字段的長度是非
固定的,爲了確認整個TCP數據包的大小,就須要這個標誌來講明整個數據包區段的起始位置tcp
Reserved(保留):未使用的保留字段ide
Code(Control Flag),控制標誌碼):當咱們在進行網絡鏈接的時候,須要說明這個鏈接的
狀態,好讓接收端了解這個數據包的主要操做,這但是一個很是重要的句柄,這個字段共有
6個bits,分別表明6個句柄,若爲1則爲啓動,分別說明:大數據
1) URG(Urgent):若爲1則表明該數據包爲緊急數據包,接收端應該緊急處理,且圖中的Urgent
Pointer字段也會被啓用
2) ACK(Acknowledge):若爲1表明這個數據包爲響應數據包,則與上面提到的Acknowledge
Number有關
3) PSH(Push Function):若爲1,表明要求對方當即傳送緩衝區內的其餘對應數據包,而
無須等待緩衝區滿了才送
4) RST(Reset):若是RST爲1的時候,表示鏈接會立刻結束,而無須等待終止確認手續,
這就是說,這個是強制結束的鏈接,且發送端已斷線
5) SYN(Synchronous):若爲1,表示發送端但願雙方創建同步處理,也就是要求創建鏈接。
一般帶有SYN標誌的數據包表示主動要鏈接到對方的意思
6) FIN(Finsh): 若爲1,表示傳送結束,因此通知對方數據傳畢,是否贊成斷線,只是發
送者還在等待對方的響應而已
其中比較常見的應該是ACK、SYN、FIN等,這3個句柄是務必要記下來的。網站
Window(滑動窗口):主要是用來控制數據包的流量,能夠告知對方目前自己有的緩衝器
容量(Receive Buffer)還能夠接收數據包。當Window=0時,表明緩衝器已經額滿,
應該要暫停傳輸數據。Windows的單位是Byte
Checksum(確認校驗碼):當數據要有發送端送出前,會進行一個檢驗的操做,並將該操做
的檢驗值標註在這個字段上,而接收者收到這個數據包以後,會再次的對數據包進行
驗證,而且比對原發送的Checksum值是否相符,若是相符就接受,若不符就會假設該
數據包已經毀損,進而要求對方從新發送此數據包
Urgent Pointer(緊急信息):當Code字段內的URG=1時,Urgent Pointer纔會產生做用
能夠告知緊急數據所在的位置
Options(任意信息):目前此字段僅應用於表示接收端能夠接收的最大數據區段容量,若此
字段不使用,表示可使用任意數據區段的大小,這個字段較少用
Padding(補足字段):如同ip數據包須要有固定的32bits表頭同樣,Options因爲字段非
固定,因此也須要Padding字段來加以補齊才行
3d
TCP三次握手流程:
A:數據包發起。當客戶端想要對服務器端鏈接時,就須要送出一個要求鏈接的數據包,
此時客戶端必須隨機取用一個大於1024的端口來做爲程序通訊的接口,而後在TCP
的表頭中,須要帶有SYN的主動鏈接(SYN=1),而且記下發送出鏈接數據包給服務
器端的序號(Sequence Number=10001)
B:數據包接收與確認數據包傳送。當服務器接收到這個數據包,而且肯定要接收這個
數據包後,就會開始製做一個同時帶有SYN=一、ACK=1的數據包,其中那個Acknowledge
的號碼是要給Client端確認用的,因此該數字會比(A步驟)裏面的Sequence號碼多
一號(ack=10001+1=10002),服務器也須要確認客戶端確實能夠接收咱們的數據包
才行,全部也會發送出一個Sequence(seq=20001)給客戶端,而且開始等待客戶
端給咱們服務器端的響應
C:回送確認數據包。當客戶端收到來自服務器端的ACK數字後(10002)就可以確認
以前那個要求數據包被正確地接收,接下來若是客戶端也贊成與服務器端創建
鏈接,就會再次發送一個確認數據包(ACK=1)給服務器,即Acknowledge=20001+1=20002
D:取得最後確認。若一切順利,在服務器端收到帶有ACK=1且ack=20002序號的數據包後
,就可以創建起此次的鏈接了
不管是服務器仍是客戶端,都須要經過一次SYN與ACK來創建鏈接,因此總共會進行3次
握手
blog
注:當咱們使用tcpdump在Router上面監聽明文的傳輸數據時,例如FTP傳輸協議,你以爲會
發生什麼問題?咱們先在主機端執行「tcpdump -i lo port 21 -nn -X",而後登錄並輸入
密碼,結果你會發現能夠監聽到FTP的用戶名和密碼
例:# tcpdump -nn -X 'port 80'
17:53:02.241489 IP 123.125.71.77.16161 > 10.156.239.0.80: P 1:262(261) ack 1 win 1460
0x0000: 4500 012d 6c6e 4000 2d06 23f6 7b7d 474d E..-ln@.-.#.{}GM 0x0010: 0a9c ef00 3f21 0050 b348 d746 b075 6c65 ....?!.P.H.F.ule 0x0020: 5018 05b4 8606 0000 4745 5420 2f66 6f72 P.......GET./for 0x0030: 756d 2e70 6870 3f6d 6f64 3d66 6f72 756d um.php?mod=forum 0x0040: 6469 7370 6c61 7926 6669 643d 3226 7061 display&fid=2&pa 0x0050: 6765 ge 17:53:02.241565 IP 10.156.239.0.80 > 123.125.71.77.16161: . ack 262 win 14 0x0000: 4500 0028 3ee5 4000 4006 3f84 0a9c ef00 E..(>.@.@.?..... 0x0010: 7b7d 474d 0050 3f21 b075 6c65 b348 d84b {}GM.P?!.ule.H.K 0x0020: 5010 000e 0b7f 0000 P....... 17:53:02.283377 IP 10.156.239.0.80 > 123.125.71.77.16161: . 1:2921(2920) ack 262 win 14 0x0000: 4500 0b90 3ee6 4000 4006 341b 0a9c ef00 E...>.@.@.4..... 0x0010: 7b7d 474d 0050 3f21 b075 6c65 b348 d84b {}GM.P?!.ule.H.K 0x0020: 5010 000e c7e9 0000 4854 5450 2f31 2e31 P.......HTTP/1.1 0x0030: 2032 3030 204f 4b0d 0a53 6572 7665 723a .200.OK..Server: 0x0040: 206e 6769 6e78 0d0a 4461 7465 3a20 5375 .nginx..Date:.Su 0x0050: 6e2c