網路協議筆記一 TCP連線管理

2021-10-06 13:18:02 字數 4429 閱讀 7498

處理差錯的兩種主要方法是差錯校正碼和資料重傳。

差錯校驗碼:基本上是新增一些冗餘的位元,使得即使某些位元被毀,正確的資訊也可以被簡單的恢復。

流量控制:

流量控制分為基於速率的和基於視窗的。

基於速率的流量控制是傳送方指定某個傳送資料的速率,則資料不能超過這個速率傳送,多用於多播和組播。

基於視窗的流量控制是傳送方和接收方都維護乙個滑動視窗(大小可變),接收方可以通知傳送方使用多大的視窗,簡稱視窗通告或視窗更新。多用於tcp協議,視窗通告是和ack於同乙個分組。

tcp使用的ack是積累的,乙個ack等於n的ack表示對端成功收到所有直到序號n(但不包含n)的位元組。魯棒性:如果中間乙個ack丟失,但是後面到達的ack就可以幫忙確認前面的資料了,而不會導致資料的重傳。

tcp不會為每乙個報文都設定乙個不同的重傳計時器。而是傳送乙個視窗的資料,它只設定乙個計時器,當收到ack時才更新超時時間。如果有乙個確認以及後面已傳送序號的確認沒有及時收到,則會重傳這些已傳送的報文段。

擁塞控制:

流量控制處理傳送方和接收方收發資料的關係, 擁塞控制則是通過調節傳送方的傳送速率來處理兩方之間的網路(路由器)。

tcp接收端可能對乙個已確認過的報文段再次確認,以幫助傳送方計算它的擁塞控制。

tcp中的可靠性:

tcp的序列號代表了每乙個分組的第乙個位元組在整個資料流中的位元組偏移,應用層傳送的資料可以在tcp中被拆成不同的資料報傳送到對端,並在對端的tcp層中得以按位元組的順序重組。

為了保證交給應用層的資料順序正確,tcp接收端可能會使序號靠後的資料先不交給應用層,直到前面有缺失的序列號的報文段被補齊。

syn和fin會消耗乙個序列號,而ack不消耗序列號。

tcp可以被描述為「一種帶積累正向確認的滑動視窗協議」。ack號字段為構建為用於指明在接收方已經順序收到的最大位元組加1。即中間有報文還沒有收到,儘管收到了之後的報文,也不能回應ack確認。但是現代tcp有sack選擇確認的選項,可以允許接收方告訴對端自己正確接收到的次序雜亂的資料。

tcp的半關閉操作是指關閉資料流的乙個傳輸方向,兩個半關閉操作才能夠關閉整個連線。tcp協議規定通訊的一方在完成所有資料傳送後,能向對方傳送一fin。當對方收到這個fin分節時,就會告知應用程式對方已經終止了對應方向的資料傳輸。

乙個同時開啟三次握手連線的過程需要交換4個報文段,比普通的三次握手增加了乙個。

初始序列號:

序列號可能導致的問題:在乙個連線中,tcp報文段在經過網路路由後可能會存在延遲抵達和排序混亂的情況:如果連線因為某個報文段的長時間延遲而被關閉,然後又重新開啟相同4元組的連線,之前延遲的報文段又會被誤以為是有效資料重新進入新的連線中,導致序列號重疊。因為乙個tcp報文段被對方認為是正確的條件是:同時具備連線的4元組合當前活動視窗的序列號。另一種問題是可能會收到攻擊,任何人只要選擇合適的序列號和套接字,都可以偽造出乙個tcp報文段,從而打斷正常的tcp連線。

所以為了解決這個問題,需要仔細選擇初始序列號。

tcp解決方式:在傳送syn分節建立連線之前,通訊雙方都會各自選擇乙個初始序列號,初始序列號隨著時間而變化(32位的計數器,每4微秒加1),因此每個連線都有不同的初始序列號,防止與其他連線的序列號重疊。還可以在應用層利用crc或校驗和的方式保證資料接收的正確性。

具體方法:現代系統通常採用半隨機的方法選擇初始序列號。linux系統採用乙個基於時鐘的方案,通過雜湊函式來為每一連線的時鐘設定隨機偏移量,使得生成的序列難以被猜出,且隨時間變化,32位的初始序列號中,高8位是保密的序列號,其餘各位由雜湊函式生成。

連線建立超時:

在linux系統中,系統變數net.ipv4.tcp_syn_retries表示在一次主動開啟申請中嘗試重新傳送syn報文段的最大次數;系統變數net.ipv4.tcp_syack_retries表示在重新傳送syn+ack報文段的最大次數。它們的預設值都是5次。每一次重發的延遲時間都是上一次時間的兩倍,稱為指數回退。

psh(推送位)被置1,則表示該報文段正在傳送所有來自己緩衝區的資料。

tcp選項:

每個選項的頭乙個位元組表示為「種類」,大多選項都會根據自己的種類來確定自身的位元組數len,選項的總長度包括了種類與len個位元組。

由於tcp的頭部的長度應該是32位bit的整數倍,所以nop是用於給資料傳送者填充空間用的,為了對齊。eol表示為選項的結尾。

常見的tcp選項如:

1、最大段大小選項mss:tcp協議允許的從對方接收到的最大報文段(只包括tcp資料部分,而不包括頭部),也是通訊雙方在傳送資料時能夠使用的最大報文段。預設是536位元組,在通訊開始時syn報文通告對方,表明自己在整個連線中不願意收到比這個更大的tcp資料段。典型值是1460位元組,因為mss1460+tcp頭部20+ip頭部20=1500位元組,是乙太網的最大傳輸單元mtu和網際網路路徑最大傳輸單元的典型值。

2、選擇確認選項sack:當接收到亂序的資料時,它能夠告訴對端已經成功接收到的資料塊的序列號範圍,從而幫助對端有效的重傳。每乙個範圍被稱作乙個sack塊,乙個選項最多可以包含3個sack塊。該選項的開啟是在通訊雙方開始時的syn報文段傳送的,但是只要已經傳送了該選項,sack塊就能通過任何報文段傳送出去。

3、視窗縮放選項wsopt:能夠有效地將tcp視窗廣告欄位的範圍從16位擴充套件到30位,用於在大寬頻、高延遲網路上提供海量資料傳輸服務時。該選項需要在通訊雙方的syn報文段包含,由通訊雙方根據接收快取的大小自動選取。

4、時間戳選項tsopt:傳送方新增兩個4位元組的時間戳數值,第乙個部分在傳送者賦值填充;第二個是【時間戳回顯重試字段】由接收方收到時原封不動地填充,這樣回發給傳送方的時候,傳送方就知道自己之前傳送的時間戳,以此來估計rtt(即傳送方報文的tsv和接收方回應ack的tser值一樣)。時間戳的作用是:(1)估算重傳時間,為了設定重傳超時;(2)防迴繞序列號(【舊的報文段重新出現幷包含當前正在傳輸的序列號】的問題只會出現在相對高速的連線中,通過時間戳可以區分新舊報文段)。

5、使用者超時選項uto:指明傳送者在確認對方未能成功接收資料之前願意等待該資料ack的時間。

tcp路徑最大傳輸單元發現過程:

乙個連線的兩個方向的路徑最大傳輸單元是不同的。當中間路由器的最大傳輸單元小於任何乙個通訊端的最大段大小時,tcp就會執行【路徑最大傳輸單元發現過程】,即嘗試發現適合的mss。

time_wait狀態:

客戶端通常執行主動關閉操作,主動請求關閉連線的一方,在傳送最後乙個ack後,會進入time_wait狀態,又稱2msl(最大段生存期的兩倍)等待狀態。因為被動關閉連線的一方經常會重傳fin報文,直到收到乙個最終的ack。為了避免發給對端的ack丟失,主動關閉連線的一端需要在傳送完ack後等待2msl時間。處於time_wait狀態的埠號不能被重複使用,因此終止乙個客戶端後立刻重啟同乙個客戶端,新的客戶端應該選用和上乙個客戶端不同的埠號。但如果我們將乙個已有tcp連線的服務端終止並馬上重啟,服務端會收到乙個「繫結失敗的錯誤」,這是因為服務端程式通常使用固定的埠號,這是前乙個連線的處於2msl等待狀態造成的。通過套接字選項so_reuseaddr可以重複繫結同乙個埠號。2msl狀態能防止新的連線誤將前乙個連線的延遲報文段接收。

fin_wait2狀態:

主動傳送關閉請求的一方在收到第乙個ack後,會進入fin_wait2狀態,除非出現半關閉的情況,不然此時tcp連線的對端會識別接收到eof(檔案末尾通知),並傳送fin。

為了不永遠處於等待對端fin的fin_wait2狀態,tcp的做法是:如果主動關閉的一端執行的是乙個完全關閉的操作,而不是半關閉來指明它還期望收到資料,那麼就會設定乙個計時器,如果當計時器超時的時候連線是空閒的,則tcp就會轉移到closed狀態。linux系統下預設值是60s。

重置報文段(rst欄位):

產生rst的三個情況:

1、不存在埠的連線請求:當乙個連線請求到達對端,但是對端的目的埠沒有正在監聽的tcp程序,此時對端就會傳送乙個rst回來。而udp協議是,當乙個資料報到到乙個不能使用的目的埠時,會生成乙個icmp目的地不可達的訊息,tcp協議則是使用了重置報文段來代替完成相關工作。

2、tcp想取消乙個已有的連線:傳送fin關閉連線是屬於有序釋放,但是可以通過傳送rst來關閉連線,屬於終止釋放。終止釋放可以為應用程序提供兩大特性:(1)任何排隊的資料都將被拋棄,乙個重置報文段會被立刻傳送出去;(2)重置報文段的接收方會說明通訊另一端採用了終止的方式,而不是一次正常關閉。重置報文段不會令通訊的另一端做出任何響應——它不會被確認,接收重置報文段的一端會終止連線並通知應用程式當前連線已重置,收到rst會導致read函式在讀取socket描述符時返回-1。

3、半開連線中,重置報文作為對上一次連線的資料的響應:乙個常見的例子是:伺服器主機被切斷連線後重啟,留給客戶端乙個半開連線。當再次從這條

連線上收到資料時,服務端已經忘記了之前的連線,會給該資料的連線回應乙個rst,然後連線被關閉。

tcp埠號:

TCP連線管理

tcp是面向連線的協議,因此每個tcp連線都有三個階段 連線建立 資料傳送和連線釋放。tcp連線的管理就是使運輸連線的建立和釋放都能正常進行。在tcp連線建立的過程中,要解決以下三個問題 要使每一方都能確知對方的存在。要允許雙方協商一些引數 如最大視窗值 是否使用視窗擴 項 時間戳選項以及服務質量等...

TCP 連線管理

本節將介紹一條tcp連線是如何建立和拆除的。此處假設客戶機a上面的乙個程序想要和服務 器b上的乙個程序建立一條tcp連線。本文前面介紹的是比較正常的連線和拆除,特殊的會在後面介紹。第一步客戶機a的tcp會向伺服器的tcp傳送乙個不包含應用層資料的資料的tcp報文段。該報文段中首部標誌位s yn被置為...

TCP連線管理

一些基本的概念可以先看另一篇部落格 這篇直接對tcp連線過程做筆記 1.tcp連線詳細過程 假設執行在主機 客戶 的乙個程序想跟另一台主機 伺服器 上程序建立乙個連線 第一步 客戶端的tcp首先向服務端的tcp傳送乙個特殊的tcp報文段。該報文段不包含應用層資訊。報文段的syn 標誌位 置1。因此這...