「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,免费。


推荐阅读:
相关文章