為什麼UDP需要有長度字段,而TCP不需要長度欄位呢?

時間 2021-05-07 03:54:05

1樓:whoami

TCP頭部大小是可變的,到TCP頭部有4bit用來表示資料偏移(單位是4位元組),其實也就是頭部的大小,這樣上層協議就知道TCP資料部分的開始位置,知道怎麼去重整資料。

UDP頭部確實是多餘的,他是固定的八字節,很明顯8位元組後面的就是UDP資料部分,這樣上層應用就可以得到這些資料,後續由應用處理。

我認為不需要考慮到單個UDP/TCP發下去會分片,因為順協議棧下發即使分片了,我們收到時,到TCP/UDP所在的這一層收到時也應該已經重組了。

2樓:lalala

tcp是流,那個ip包承載多少,根本不用管。再說,它有序列號,可以知道發了多少啦。

udp不一樣,它是不可靠的按照包來發的

3樓:一壺濁酒

UDP沒有長度欄位會導致報文併發大的時候組裝錯誤,程序socket在取報文時可能把兩條報文視為一條。TCP頭部有標誌位,不會有這個問題

4樓:聽說學逗唱

印象中《計算機網路》裡提到過UDP報頭設計時發現有一些空間多餘,同時帶有的UDP長度資訊確實沒有也可以。但是為了網路裝置硬體設計和處理方便,報頭長度需要是4位元組的整數倍。經過各種權衡就加上了。

5樓:車小胖

TCP像一輛超載的客車,裝的人太多,容納不了乙個長度字段,但接收端可以隱含計算出。

UDP轎車很空,正好剩個位子容納UDP長度字段,無需隱含計算,省點事,況且那兩個位元組不放長度字段,放點啥好呢?

一端傳送的協議報文,另外一端一定要有方法知道協議報文的長度,如果沒有方法知道,那這個協議一定是乙個假的協議。

TCP

儘管TCP沒有乙個長度字段,來明確自己報文的長度,但是並不意味著接收端不需要知道TCP報文的長度,否則,TCP如何計算自己的checksum? 畢竟TCP的checksum需要將TCP報文長度也包括在內。

那TCP是如何計算的?

IP報文 = IP Header + IP Option/Padding + TCP報文

TCP報文長度 = IP報文長度 - IP Header長度- IP Option/Padding長度

IP報文長度已知,(IP Header /Option/Padding)長度已知,所以TCP報文長度,接收端一定可以計算出。

TCP報文 = TCP Header + TCP Option/Padding + TCP Payload

TCP Header = 20

TCP Option/Padding = Data Offset * 4 -20

Data Offset在TCP報文頭里顯示已知,所以接收端可以計算出TCP Option/Padding 的長度。

TCP Payload長度

= TCP報文- TCP Header - TCP Option/Padding

= TCP報文 - 20 -(Data Offset * 4 -20 )

= TCP報文 - Data Offset * 4

= IP報文長度 - (IP Header /Option/Padding)長度 - Data Offset * 4

綜上所述,接收端可以隱含地計算出上述任何字段,其中還包括IP Padding 、TCP Padding 的填充長度。

退一步講,如果接收端不知道填充物的長度,如何剝掉填充物?

6樓:Kavi Zhang

udp任何字段設計,當時都是有考慮的,絕不會浪費任何頻寬資源。雖然在正常情況下,udp length 是多餘。但是udp設計length 時候,是考慮ip分片的問題,為了分片後能夠知道上層udp長度。

假如乙個udp包文2000,被分為兩個ip fragment 包,乙個1500,1個500。udp頭的資訊都在第乙個,如果udp不帶length ,那麼上面應用層無法知道這個udp包文是否完整。同樣的情況,對tcp沒用,因為tcp是stream機制

7樓:肖巨集輝

感覺這個問題要被帶偏,再多說幾句。作為乙個搬運工,搬運經典裡面的一段話 Steven,W.R.

翻譯一下:UDP length欄位是冗餘的,它等於IP total length 減去IP header。

兩個誤區:

誤區一:IP Fragment使得IP header裡的length表示每一段長度,UDP header裡的length表示總長度。但是資料到了UDP這一層,肯定是reassemble完了啊。

難道協議棧傻到不能通過reassemble的過程獲取到IP報文的總長度,進而通過IP報文總長度獲得UDP長度嗎?

誤區二:協議是分層的,每一層都要有自己的長度。的確有一些4-7層協議頭有自己的length欄位。

但是不能說所有都有,例如BGP header就有length,DHCP header就沒有length。

以下原回答:

先來看IP header

我們在這裡有乙個長度「Total Length」。

再來看在IP報文裡面的TCP header:

TCP Data的長度= IP總長度 - IP Header長度 - TCP Header長度。

因此,TCP程式在處理過程中,不需要長度也能完成工作。

那問題來了,UDP為什麼需要長度字段?

先看看IP報文裡面的UDP header

貌似也可以通過 「IP總長度 - IP Header長度 - UDP Header長度」 得到啊。

對,是可以。

那UDP長度有什麼意義?實際上沒什麼意思。但是如果不認真填寫UDP Header裡面的Length的話,一些應用程式可能還會報錯,因為你不知道應用程式究竟是從IP Header來獲取長度還是從UDP Header來獲取長度。

所以說,在UDP報文裡面,有兩個攜帶重複資訊的長度字段。

為什麼會這樣?不知道。有可能是UDP和IP協議並行發展的結果。或者說,UDP並不是等IP完全占領主導地位之後才開發的協議。

UDP難道就不思進取嗎?在04年的UDP lite協議裡,實際上UDP Header裡面的Length欄位已經變了,變成了參與計算校驗和的位元組數。在這個協議裡面,UDP的資料長度就是從IP Header計算而來。

The Lightweight User Datagram Protocol (UDP-Lite)

8樓:zr scat

用簡單來講的話就是:

tcp是流式傳輸協議,並不關心單次傳輸多少資料,實際上由於網路裝置的影響,也會發生將一次tcp傳輸拆解為多次,或者多次tcp傳輸合併為一次的情況(粘包),所以在tcp層面上長度是沒有意義的。

這個問題是個好問題,我覺得產生疑惑的根本原因是沒有理解協議是分層的。

為什麼 RIP 協議是裝在 UDP 報文裡,而 OSPF 卻直接通過 IP 資料報發出?

以前的網路是非常小的,都是主機與主機之間通訊較多,用rip協議的目的也很簡單,主機可以直接裝個應用就能使用rip協議了。目前的linux和windows server系統都是支援rip協議的。 勉強回答一下 RIP出現的早,年就出現了,那時候網路都很小,RIP就夠用了,另一方面TCP IP構架才剛剛...

人為什麼需要有脾氣?

先修正一下題主的問題,題主的真正意思應該是 人需不需要把脾氣發作出來 而不是 要不要有脾氣 因為除了修到佛的境界,平常人只要是個大活人,必定是有脾氣的,不是你想不想要的問題。站在旁觀者的角度,對你這種性格的人,我覺得應該學會適當地發發脾氣。生活中很多人都有這種體會 乙個平時不怎麼發脾氣的人,偶爾發一...

為什麼C 中的int限制長度,而Python中的int不限長度?

支援向量機 C int是記憶體順序排列的二進位制,在同一計算機編譯器下是定長的,常見的都是4位元組。而python的int是乙個類,不僅僅是一段記憶體資料,還有各種方法,屬性,最關鍵的是,它是變長的,如下所示 struct longobject PyObject VARHEAD說明int Py3中只...