tcp三次握手詳解

############################# 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

相關文章
相關標籤/搜索