天天看點

tcp校驗和計算校驗和例子_淺談TCP協定,總算明白它是幹什麼的了

一、什麼是TCP,他是幹什麼的?

TCP即傳輸控制協定(Transmission Control Protocol)是一種面向連接配接的、可靠的、基于位元組流的傳輸層通訊協定。

TCP是為了在不可靠的網際網路上提供可靠的端到端位元組流而專門設計的一個傳輸協定。

網際網路與單個網絡有很大的不同,因為網際網路的不同部分可能有截然不同的拓補結構、帶寬、延遲、資料包大小和其他參數。TCP的設計目标是能夠動态地适應網際網路的這些特性,而且具備面向各種故障的健壯性。

不同主機的應用層之間經常需要可靠的、像管道一樣的連接配接,但是IP層不提供這樣的流機制,而是提供不可靠的包交換。

應用層向TCP層發送用于網間傳輸的、用8位位元組表示的資料流,然後TCP把資料流分區成适當長度的封包段(通常受計算連接配接的網絡的資料鍊路層的最大傳輸單元(MTU)的限制)。之後TCP把結果包傳輸給IP層,有它來通過網絡将包傳送給接收端實體的TCP層。

TCP為了保證不發生丢包,就給每個包一個序号,同時序号也保證了傳送到接收端實體的包的按序接收。然後

接收端實體對已成功接收到的包回一個相應的确認(ACK);如果發送端實體在合理的往返時延(RTT)内未接收到确認,那麼對應的資料包就被假設為已丢失将會被進行重傳。TCP用一個校驗和函數來校驗資料是否有誤;在發送和接收時都要計算校驗。

每台支援TCP的機器都有一個TCP傳輸實體。TCP 實體可以時一個庫過程、一個使用者程序、或者核心的一部分。在所有這些情形下,它管理TCP流,以及與IP層之間的接口。TCP傳輸實體接收本地程序的使用者資料流,将他們分割成不超過64KB(實際上去掉IP和TCP頭,通常不超過1460資料位元組)的分段,每個分段以單獨的IP資料報形式發送。當包含TCP資料的資料報到達一台機器時,它們被遞交給TCP傳輸實體,TCP傳輸實體重構出原始的位元組流。為簡化起見,我們有時候僅僅用TCP來代表TCP傳輸實體(一段軟體)或者TCP協定(一組規則)。根據上下文語義你應該能很清楚的推斷出其實際含義。例如,在‘使用者将資料送出給TCP’這句話中,很顯然這裡指的時TCP實體。

IP層并不保證資料報一定被正确的送出到接收方,也不隻是資料報的發送速度有多塊。正是TCP負責紀要足夠快的發送資料報,以便使用網絡容量,但又不能引起網絡阻塞:而且,TCP逾時後,要重傳沒有遞交的資料報。即使被正确遞交的資料報,也可能存在錯誤的問題,這也是TCP的責任,它必須把接收到的資料報重新裝配成正确的順序,簡言之,TCP必須提供可靠性的良好性能,這正是大多數使用者所期望的而IP又沒有提供的功能。

二、主要特點

當應用層向TCP層發送用于網間傳輸的、用8位位元組表示的資料流,TCP則把資料流分割成适當長度的封包。之後TCP把資料包傳遞給IP層,由它來通過網絡将包傳送給接收端實體的TCP層。

TCP是一種面向廣域網的通信協定,目的是在跨越多個網絡通信時,為兩個通信端點之間提供一條具有一下特點的通信方式:

(1)基于流的方式;

(2)面向連接配接;

(3)可靠通信方式;

(4)在網絡情況不佳的時候盡量降低系統由于重傳帶來的帶寬開銷;

(5)通信連接配接維護是面向的兩個端點的,而不考慮中間網段和節點。

為滿足TCP協定的這些特點,TCP協定做了以下規定:

①資料分片:在發送端對使用者資料進行分片,在接收端進行重組,由TCP确定分片的大小并控制分片和重組;

②到達确認:接收端接收到分片資料時,根據分片資料序号向發送端發送一個确認;

③逾時重發:發送方在發送分片時啟動逾時定時器,如果在定時器逾時之後沒有接收到對應的确認,重發分片;

④滑動視窗:TCP連接配接每一方的接收緩沖空間大小都固定,接收端隻允許另一端發送接收端緩沖區所能接納的資料,TCP在滑動視窗的基礎上提供流量控制,防止較快主機緻使較慢主機的緩沖區溢出;

⑤失序處理:作為IP資料報來傳輸的TCP分片到達時可能會失序,TCP将對接收的資料進行重新排序,将接收到的資料以正确的順序交給應用層;

⑥重複處理:作為IP資料報來傳輸的TCP分片會發生重複,TCP的接收端必須丢棄重複的資料;

⑦資料校驗:TCP将保持它首部和資料的校驗和,這是一個端到端的校驗和,目的是檢測資料在傳輸過程中的任何變化。如果收到分片的校驗和由差錯,TCP将丢棄這個分片,并确認接收到此封包段導緻對端逾時并重發。

三、工作方式

建立連接配接

TCP是網際網路中的傳輸層協定,使用三次握手協定建立連接配接。當主動方發出SYN連接配接請求後,等待對方回答SYN+ACK,并最終對對方的SYN執行ACK确認。這種建立連接配接的方法可以防止産生錯誤的連接配接,TCP使用的流量控制協定是可便大小的華東視窗協定。

TCP三向交握的過程如下:

(1)用戶端發送SYN(SEQ=x)封包給服務端,進入SYN_SEND狀态。

(2)服務端接收SYN封包,回應一個SYN(SEQ=y)ACK(ACK=x+1)封包,進入SYN_RECV狀态。

(3)用戶端收到伺服器端的SYN封包,回應一個ACK(ACK=y+1)封包,進入Established狀态。

三次握手完成,TCP用戶端和伺服器端成功的建立連接配接,可以開始傳輸資料了。如圖:

tcp校驗和計算校驗和例子_淺談TCP協定,總算明白它是幹什麼的了

連接配接終止

建立一個連接配接需要三次握手,而重一一個連接配接要經過四次握手,這是由TCP的半關閉(half-close)造成的。具體過程如下圖所示。

tcp校驗和計算校驗和例子_淺談TCP協定,總算明白它是幹什麼的了

(1)某個應用程序首先調用close,稱該端執行”主動關閉“(active close)。該端的TCP于是發送一個FIN分節,表示資料分發完畢。

(2)接收到這個FIN的對端執行”被動關閉“(passive close),這個FIN由TCP确認。

注意:FIN的接收也作為一個檔案結束符(end-of-file)傳遞給接收端應用程序,放在已排隊等候應用程序接收的任何其他資料報之後,因為,FIN的接收意味着金額手段應用程序相應連接配接再無額外資料可接收。

(3)一段時間後,接收到這個檔案結束符的應用程序将調用close關閉它的套接字,這導緻它的TCP也發送一個FIN。

(4)接收這個最終FIN的原發送端TCP(即執行主動關閉的那端)确認這個FIN。既然每個方向都需要一個FIN和一個ACK,是以通常需要4個分節。

tcp校驗和計算校驗和例子_淺談TCP協定,總算明白它是幹什麼的了