TCP 傳輸控制協議

開頭先說幾個協議:

IP:網際協議html

TCP:傳輸控制協議git

Http:超文本傳輸協議github

AMQP:高級消息隊列協議安全

一:TCP是什麼?

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向鏈接的、可靠的、基於字節流的傳輸層通訊協議。服務器

首先來看看OSI的七層模型:網絡

img

咱們須要知道TCP工做在網絡OSI的七層模型中的第四層——Transport層,IP在第三層——Network層,ARP在第二層——Data Link層;併發

在第二層上的數據,咱們把它叫Frame,在第三層上的數據叫Packet,第四層的數據叫Segment。tcp

同時,咱們須要簡單的知道,數據從應用層發下來,會在每一層都會加上頭部信息,進行封裝,而後再發送到數據接收端。這個基本的流程你須要知道,就是每一個數據都會通過數據的封裝和解封裝的過程。學習

在OSI七層模型中,每一層的做用和對應的協議以下:3d

img

詳細協議:

OSI:
物理層:EIA/TIA-232, EIA/TIA-499, V.35, V.24, RJ45, Ethernet, 802.3, 802.5, FDDI, NRZI, NRZ, B8ZS
數據鏈路層:Frame Relay, HDLC, PPP, IEEE 802.3/802.2, FDDI, ATM,  IEEE 802.5/802.2, 【ARP,RARP】,VLAN、MAC
網絡層:IP,IPX,AppleTalk DDP,OSPF、RIP、IGRP、ICMP、ARP、RARP
傳輸層:TCP,UDP,SPX 
會話層:RPC,SQL,NFS,NetBIOS,names,AppleTalk,ASP,DECnet,SCP 
表示層:TIFF,GIF,JPEG,PICT,ASCII,EBCDIC,encryption,MPEG,MIDI,HTML 
應用層:HTTP,FTP,WWW,Telnet,NFS,SMTP,Gateway,SNMP

在Wireshark中對應查看:

img

二:查看TCP頭部:

img

頭部的詳細說明:

Source Port和Destination Port:分別佔用16位,表示源端口號和目的端口號;用於區別主機中的不一樣進程,而IP地址是用來區分不一樣的主機的,源端口號和目的端口號配合上IP首部中的源IP地址和目的IP地址就能惟一的肯定一個TCP鏈接;

Sequence Number:用來標識從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的的第一個數據字節在數據流中的序號;主要用來解決網絡報亂序的問題;

Acknowledgment Number:32位確認序列號包含發送確認的一端所指望收到的下一個序號,所以,確認序號應當是上次已成功收到數據字節序號加1。不過,只有當標誌位中的ACK標誌(下面介紹)爲1時該確認序列號的字段纔有效。主要用來解決不丟包的問題;

Offset:給出首部中32 bit字的數目,須要這個值是由於任選字段的長度是可變的。這個字段佔4bit(最多能表示15個32bit的的字,即4*15=60個字節的首部長度),所以TCP最多有60字節的首部。然而,沒有任選字段,正常的長度是20字節;

TCP Flags:TCP首部中有6個標誌比特,它們中的多個可同時被設置爲1,主要是用於操控TCP的狀態機的,依次爲URG,ACK,PSH,RST,SYN,FIN。每一個標誌位的意思以下:

URG:此標誌表示TCP包的緊急指針域(後面立刻就要說到)有效,用來保證TCP鏈接不被中斷,而且督促中間層設備要儘快處理這些數據;

ACK:此標誌表示應答域有效,就是說前面所說的TCP應答號將會包含在TCP數據包中;有兩個取值:0和1,爲1的時候表示應答域有效,反之爲0;

PSH:這個標誌位表示Push操做。所謂Push操做就是指在數據包到達接收端之後,當即傳送給應用程序,而不是在緩衝區中排隊;

RST:這個標誌表示鏈接復位請求。用來複位那些產生錯誤的鏈接,也被用來拒絕錯誤和非法的數據包;

SYN:表示同步序號,用來創建鏈接。SYN標誌位和ACK標誌位搭配使用,
當鏈接請求的時候,SYN=1,ACK=0;鏈接被響應的時候,SYN=1,ACK=1;這個標誌的數據包常常被用來進行端口掃描。掃描者發送一個只有SYN的數據包,若是對方主機響應了一個數據包回來 ,就代表這臺主機存在這個端口;
可是因爲這種掃描方式只是進行TCP三次握手的第一次握手,所以這種掃描的成功表示被掃描的機器不很安全,一臺安全的主機將會強制要求一個鏈接嚴格的進行TCP的三次握手;

FIN: 表示發送端已經達到數據末尾,也就是說雙方的數據傳送完成,沒有數據能夠傳送了,發送FIN標誌位的TCP數據包後,鏈接將被斷開。這個標誌的數據包也常常被用於進行端口掃描。

三:TCP的鏈接

TCP的傳輸主要分爲鏈接,傳輸數據,斷開鏈接

三次握手鍊接:主要根據TCP頭部中的Seq,Ack來進行判斷

查看WireShark抓包記錄:

img

查看網絡說明:

img

第一次握手:創建鏈接。客戶端發送鏈接請求報文段,將SYN位置爲1,Sequence Number爲x;而後,客戶端進入SYN_SEND狀態,等待服務器的確認;
第二次握手:服務器收到SYN報文段。服務器收到客戶端的SYN報文段,須要對這個SYN報文段進行確認,設置Acknowledgment Number爲x+1(Sequence Number+1);
          同時,本身本身還要發送SYN請求信息,將SYN位置爲1,Sequence Number爲y;服務器端將上述全部信息放到一個報文段(即SYN+ACK報文段)中,一併發送給客戶端,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK報文段。而後將Acknowledgment Number設置爲y+1,向服務器發送ACK報文段,這個報文段發送完畢之後,客戶端和服務器端都進入ESTABLISHED狀態,完成TCP三次握手。
完成了三次握手,客戶端和服務器端就能夠開始傳送數據。以上就是TCP三次握手的整體介紹。

爲何要三次握手?

爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤。

具體例子:「已失效的鏈接請求報文段」的產生在這樣一種狀況下:client發出的第一個鏈接請求報文段並無丟失,而是在某個網絡結點長時間的滯留了,以至延誤到鏈接釋放之後的某個時間纔到達server。
原本這是一個早已失效的報文段。但server收到此失效的鏈接請求報文段後,就誤認爲是client再次發出的一個新的鏈接請求。因而就向client發出確認報文段,贊成創建鏈接。
假設不採用「三次握手」,那麼只要server發出確認,新的鏈接就創建了。因爲如今client並無發出創建鏈接的請求,所以不會理睬server的確認,也不會向server發送數據。但server卻覺得新的運輸鏈接已經創建,並一直等待client發來數據。
這樣,server的不少資源就白白浪費掉了。採用「三次握手」的辦法能夠防止上述現象發生。例如剛纔那種狀況,client不會向server的確認發出確認。server因爲收不到確認,就知道client並無要求創建鏈接。」

完整流程圖片:

img

數據傳輸完畢,斷開TCP鏈接,即四次揮手

第一次揮手:主機1(能夠是客戶端,也能夠是服務器端),設置Sequence Number和Acknowledgment Number,向主機2發送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有數據要發送給主機2了;
第二次揮手:主機2收到了主機1發送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number爲Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我「贊成」你的關閉請求;
第三次揮手:主機2向主機1發送FIN報文段,請求關閉鏈接,同時主機2進入LAST_ACK狀態;
第四次揮手:主機1收到主機2發送的FIN報文段,向主機2發送ACK報文段,而後主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段之後,就關閉鏈接;此時,主機1等待2MSL後依然沒有收到回覆,則證實Server端已正常關閉,那好,主機1也能夠關閉鏈接了。

爲何要四次分手?

TCP協議是一種面向鏈接的、可靠的、基於字節流的運輸層通訊協議。

TCP是全雙工模式,這就意味着,當主機1發出FIN報文段時,只是表示主機1已經沒有數據要發送了,主機1告訴主機2,它的數據已經所有發送完畢了;

可是,這個時候主機1仍是能夠接受來自主機2的數據;當主機2返回ACK報文段時,表示它已經知道主機1沒有數據發送了,可是主機2仍是能夠發送數據到主機1的;

當主機2也發送了FIN報文段時,這個時候就表示主機2也沒有數據要發送了,就會告訴主機1,我也沒有數據要發送了,以後彼此就會愉快的中斷此次TCP鏈接。

查看最後四條tcp記錄:

img

再看一張完整流程的圖:

img

TCP流量控制:

若是發送方把數據發送得過快,接收方可能會來不及接收,這就會形成數據的丟失。所謂流量控制就是讓發送方的發送速率不要太快,要讓接收方來得及接收。

利用滑動窗口機制能夠很方便地在TCP鏈接上實現對發送方的流量控制。

設A向B發送數據。在鏈接創建時,B告訴了A:「個人接收窗口是 rwnd = 400 」(這裏的 rwnd 表示 receiver window) 。所以,發送方的發送窗口不能超過接收方給出的接收窗口的數值。

請注意,TCP的窗口單位是字節,不是報文段。假設每個報文段爲100字節長,而數據報文段序號的初始值設爲1。大寫ACK表示首部中的確認位ACK,小寫ack表示確認字段的值ack。

img

從圖中能夠看出,B進行了三次流量控制。第一次把窗口減小到 rwnd = 300 ,第二次又減到了 rwnd = 100 ,最後減到 rwnd = 0 ,即不容許發送方再發送數據了。

這種使發送方暫停發送的狀態將持續到主機B從新發出一個新的窗口值爲止。B向A發送的三個報文段都設置了 ACK = 1 ,只有在ACK=1時確認號字段纔有意義。

TCP爲每個鏈接設有一個持續計時器(persistence timer)。只要TCP鏈接的一方收到對方的零窗口通知,就啓動持續計時器。若持續計時器設置的時間到期,就發送一個零窗口控測報文段(攜1字節的數據),那麼收到這個報文段的一方就從新設置持續計時器。

參考:

通俗大白話來理解TCP協議的三次握手和四次分手

[Wireshark基本介紹和學習TCP三次握手](https://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html)

TCP 的特性

什麼是TCP/IP協議?

相關文章
相關標籤/搜索