「TCP 首部各欄位的意義和作用

「TCP首部最小為20位元組,這20位元組分為5行,每行4個位元組也就是32個位。」

大神你好,這個地方不是很理解。特別是圖,看了很多TCP/IP的解釋,都比較類似。數據包不應該是10100001010這種字元串么,20個位元組是不是應該從0到159么?為什麼是5行每行4位元組呢?這個圖是為了編輯方便才縱向排布的么?


」TCP首部最小為20位元組「,這一句就是字面意思,首部有20個位元組。

」這20位元組分為5行,每行4個位元組也就是32個位。「,這只是為了更方便的讓讀者直觀的看到這20個位元組是什麼,包含哪些內容,每一段內容在這20位元組的什麼位置。實際上是沒有什麼5行,每行4位元組這樣的東西。

你可以把這張圖轉成如下的位元組流(回復可能有自動換行,請自行腦補成1行)

[源埠號(2位元組)][目標埠號(2位元組)][32位序列號(4位元組)][32位確認號(4位元組)][首部長度(4位)][保留(6位)][URG(1位)][ACK(1位)][PSH(1位)][RST(1位)][SYN(1位)][FIN(1位)][窗口大小(2位元組)][校驗和(2位元組)][緊急指針(2位元組)]


數據到bit層面上看是0101這樣的二進位.....但是不是字元串......這個大概是你的語病,5行4位元組....5*4*20 =160撒,對應0-159沒問題....確實是因為編輯方便所以摺疊了


如果你是程序員,看到4個位元組32位應該很容易理解的啊。32位不就是CPU的數據匯流排嗎?一行就說明要一次cpu time,當然現在都是64位了,你也可以重新排。

你沒有理解計算機的定址方式。一般計算機是不會按照比特定址的,一般是按照字(word)定址或者是雙字定址。簡單的理解就是需要知道哪一段的二進位代表了什麼意思,這個就找成了這樣排布的原因。


首先你沒有搞明白什麼是二進位什麼是位元組什麼是字元串,其實一個英文字元要佔一個位元組,01這樣的二進位數據首先要8位分組組成一個位元組例如1011010這個位元組用16進位表達就是5A十進位表達就是90,在ASCII對照表中90就是大寫字元"Z",你可能注意到了ASCII對照表最大是255(十六進位FF)因為一個位元組只有8bit,8bit最大能表示的數就是11111111,當然網路中不是所有位元組都是字元像tcp協議中的四個位元組的ip地址比如255.255.255.255這四個位元組僅僅只是表示數字,你也可以去ASCII表裡去找它們的對應字元但得到的只是無意義的亂碼而已(不過可能有些位元組可能剛好在ASCII的可顯字元區)。當然你也不能一個一個位元組的處理因為tcp中的很多信息是跨位元組的比如6位指針位信息(它和前面的保留位後兩位共享一個位元組),這時候你需要用二進位位運算來取出指針位


你說的很對,就是為了方便看才這樣畫。就是一串bit流,刻意畫成這樣,沒有任何深意。但是協議頭看多了,你就會發現經常有刻意地8bit對齊,也就是一個octbyte。


上邊的0-31是一個尺子,代表每一行多少位元組,標準RFC是用+-號代表的。邏輯上的一個標記,沒有太大意義。

知乎不是萬能的,在這個問題上,不如你去下載個Wireshark,免費。


推薦閱讀:
相关文章