網路的經濟基礎篇 之一 TCP UDP

2021-06-02 23:10:47 字數 2536 閱讀 3953

udp的資料部分是可選的

以位元組(8 bit)為單位,包括header和data,也就是說length的最小值是8。

計算方法和ipv4中的checksum一樣,但是ipv4中的檢驗只覆蓋header,而udp和tcp的檢驗則覆蓋它們的header和data。udp的檢驗和是可選的,而tcp的檢驗和是必需的。

注意:udp中data的長度可以為奇數位元組,但是檢驗和演算法是把若干個16 bit字相加。解決方法是在最後增加填充位元組0,這只是為了檢驗和的計算,也就是說填充位元組不被傳送。

注意:udp和tcp都使用偽頭部進行校驗和的計算,計算時需要把偽頭部放在原始udp包頭的前面。

如果檢驗和的計算結果為0,則存入的值為全1(因為在二進位制反碼運算中,二者是等價的)。如果傳送的檢驗和為0,說明傳送端沒有計算檢驗和。

udp的資料部分是可選的

用來標識報文段中的第乙個位元組的序號。

注意:當建立乙個新的連線時,syn標誌變1,此時的序號字段包含的是初始序號isn(initial sequence number),而報文段的第乙個位元組的序號為isn+1,因為syn標誌消耗了乙個序號。同樣fin標誌也要占用乙個序號。

只有ack標誌為1時,確認序號欄位才有效。確認序號字段包含的是接收端所期望收到的下乙個位元組的序號。因此,確認序號應當是上次已成功收到的資料位元組序號加1。

注意:連線一旦建立起來,ack標誌總是被設定為1,而且確認序號字段總是被設定。

以4位元組(32 bit)為單位,tcp頭的長度,包括options和padding欄位。

urg    :緊急指標(urgent pointer)有效。

ack    :確認序號有效。

psh      :接收方應該盡快將這個報文段交給應用層。

rst      :reset the connection

syn     :synchronize sequence numbers

fin      :no more data from sender

以位元組(8 bit)為單位。視窗起始於確認序號字段指定的值。

注意:udp和tcp都使用偽頭部進行校驗和的計算,計算時需要把偽頭部放在原始tcp包頭的前面。tcp length是tcp header和data的總長(以位元組為單位)。

udp的檢驗和是可選的,而tcp的檢驗和是必需的。

只有當urg標誌置1時緊急指標才有效。緊急指標是乙個正的偏移量,和序號欄位中的值相加表示緊急資料最後乙個位元組的序號。

圖1 tcp三次握手建立連線

在tcp/ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線,如圖1所示。

(1)第一次握手:建立連線時,客戶端a傳送syn包(syn=j)到伺服器b,並進入syn_send狀態,等待伺服器b確認。

(2)第二次握手:伺服器b收到syn包,必須確認客戶a的syn(ack=j+1),同時自己也傳送乙個syn包(syn=k),即syn+ack包,此時伺服器b進入syn_recv狀態。

(3)第三次握手:客戶端a收到伺服器b的syn+ack包,向伺服器b傳送確認包ack(ack=k+1),此包傳送完畢,客戶端a和伺服器b進入established狀態,完成三次握手。

完成三次握手,客戶端與伺服器開始傳送資料。

由於tcp連線是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向的連線。收到乙個 fin只意味著這一方向上沒有資料流動,乙個tcp連線在收到乙個fin後仍能傳送資料。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。

tcp採用四次揮手關閉連線如圖2所示。

圖2 tcp四次揮手關閉連線

(1)客戶端a傳送乙個fin,用來關閉客戶a到伺服器b的資料傳送(報文段4)。

(2)伺服器b收到這個fin,它發回乙個ack,確認序號為收到的序號加1(報文段5)。和syn一樣,乙個fin將占用乙個序號。

(3)伺服器b關閉與客戶端a的連線,傳送乙個fin給客戶端a(報文段6)。

(4)客戶端a發回ack報文確認,並將確認序號設定為收到序號加1(報文段7)。

1.為什麼建立連線協議是三次握手,而關閉連線卻是四次握手呢?

這是因為服務端的listen狀態下的socket當收到syn報文的建連請求後,它可以把ack和syn(ack起應答作用,而syn起同步作用)放在乙個報文裡來傳送。但關閉連線時,當收到對方的fin報文通知時,它僅僅表示對方沒有資料傳送給你了;但未必你所有的資料都全部傳送給對方了,所以你可以未必會馬上會關閉socket,也即你可能還需要傳送一些資料給對方之後,再傳送fin報文給對方來表示你同意現在可以關閉連線了,所以它這裡的ack報文和fin報文多數情況下都是分開傳送的。

2.為什麼time_wait狀態還需要等2msl後才能返回到closed狀態?

這是因為雖然雙方都同意關閉連線了,而且握手的4個報文也都協調和傳送完畢,按理可以直接回到closed狀態(就好比從syn_send狀態到establish狀態那樣);但是因為我們必須要假想網路是不可靠的,你無法保證你最後傳送的ack報文會一定被對方收到,因此對方處於last_ack狀態下的socket可能會因為超時未收到ack報文,而重發fin報文,所以這個time_wait狀態的作用就是用來重發可能丟失的ack報文。

Oracle基礎篇之一

size small 好久沒有更新我的部落格了,今天跟大家分享一下有關oracle的一些基礎知識。1.資料庫分類 a.小型資料庫 access,foxbase b.中型資料庫 mysql,sql server,informix c.大型資料庫 sybase,oracle,db2 2.如何選擇資料庫 ...

Git基礎篇之一

git config global user.name your name git config global user.email your email domain.com 1.config 的三個作用域 local 只對某個倉庫有效,git config 配置預設 命令時,等同於 local ...

php基礎篇之一

1.php是什麼 官方文件 超文字預處理器 2.php能夠做一些什麼?php主要應用在一下領域 1 伺服器端指令碼,需要 php解析器,php伺服器,php瀏覽器。2 命令列指令碼,只需要php解析器,但是依賴於cron linux unix環境 和task scheduler windows環境 ...