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中只...