TCP IP协议原理精讲

●抓包工具wireshark的安装:
1.linux下可以在终端中输入:sudo apt-get install wireshark(注意:在linux中运行wireshark的时候也要加上sudo,如:sudo wireshark,要不然可能抓不到包);
2.windos可以直接到官网下载进行安装;

●TCP/IP协议网络封包格式:
在这里插入图片描述
●MTU: Maximum Transmit Unit,最大传输单元,即物理接口(数据链路层)提供给其上层(通常是IP层)最大一次传输数据的大小;以普遍使用的以太网接口为例,缺省MTU=1500 Byte,这是以太网接口对IP层的约束,如果IP层有<=1500 byte 需要发送,只需要一个IP包就可以完成发送任务;如果IP层有> 1500 byte 数据需要发送,需要分片才能完成发送,这些分片有一个共同点,即IP Header ID相同。

●MSS:Maximum Segment Size ,TCP提交给IP层最大分段大小,不包含TCP Header和 TCP Option,只包含TCP Payload,MSS是TCP用来限制application层最大的发送字节数。如果底层物理接口MTU= 1500 byte,则 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte,如果application 有2000 byte发送,需要两个segment才可以完成发送,第一个TCP segment = 1460,第二个TCP segment = 540。

●网络报文中的payload:通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如数据量的大小、校验位等,这样就相当于给已经分批的原始数据加一些外套,这些外套起标示作用,使得原始数据不易丢失,一批数据加上“外套”就形成了传输通道的基本传输单元,叫做数据帧或数据包,而其中的原始数据就是payload。
下面是网络上的解释:
TCP报文一次性最大运输的货物量(Payload),大体可以这么来计算:
IP报文头长度 + TCP报文头长度 + Payload长度 ≤ MTU

即左边的三者之和,要小于等于右边MTU的长度,其中:

Internet 路由器接口标准MTU = 1500
IP报文头长度 = 20
TCP报文头长度 = 20

所以

Payload长度≤ MTU – IP报文头长度 – TCP报文头长度
≤ 1500 -20 -20
≤ 1460
但是TCP没有那么简单,所以还需要考虑得更多一点。

TCP报文通常有3部分组成:IP Header + TCP Header + Payload

但是,当前主流操作系统的TCP/IP协议栈,为了提高传输性能,通常还会使用 TCP Option选项。
一个例子

客户端在TCP握手连接,告诉服务器自己支持以下三个option:
(1) Maximum Segment Size
(2) SACK Permitted
(3) Timestamp

服务器接收到该报文,却有不同的意见,服务器只支持这三者中的:

(1) Maximum Segment Size
Option,翻译成中文是选项。所谓选项,不是强制标准,对方如果不支持或不理解,完全可以忽略。
在这里服务器并没有打算支持选项2 ,3, 所以双方共同支持双方的交集,即选项1。
Maximum Segment Size
MSS的存在是为了通信双方交换各自TCP Payload最大传输长度,这个长度上限一般为1460,即上文计算的方法。
如果双方的MSS不一样,将选择较小的MSS值,作为接下来通信Payload的长度上限。
假如服务器支持选项2,“Timestamp”,那么TCP报文将会包含4部分:
IP Header + TCP Header + TCP Option +Payload
这里的TCP Option为“Timestamp”,长度为 10字节,看看 Payload最大可以传输多少字节?

IP Header + TCP Header + TCP Option +Payload ≤ 1500
IP Header + TCP Header + Timestamp +Payload ≤ 1500
Payload ≤ 1500 - IP Header -TCP Header – Timestamp
≤ 1500 -20 -20 -10
≤ 1450

简而言之,没有携带option的TCP报文,最大可以支持1460字节的Payload长度。
一旦携带option,由于option需要占用空间,留给payload的空间将会相应减少,具体减少的空间等于option占用的空间。

Payload长度和Window Size有关系吗?
有一点点关系。

如果把Payload 1460看成一个标准的集装箱,Window Size可以看作双方的仓库大小,用于临时堆放对方运过来的集装箱,在集装箱被客户运走之前,一直会呆在TCP仓库里。

为了更高效地利用仓库,最理想的方法就是,仓库的大小是集装箱的整数倍,这样就不会产生零星的空间。

零星的空间一直无法使用,因为不够容纳一个标准集装箱,势必会造成仓库空间的浪费。
空间浪费只是直接后果,还有一个间接后果,更加严重。

假设接收方的仓库空间还有200字节,于是通过window size update消息告诉发送方。

发送方心急火燎发200字节,那么一个标准1460报文,将会分成8个小报文发送,这样的传输效率会非常低下。

为了避免这种低效传输场景,TCP协议有了新的严格规定:

如果 window size < MSS , 不允许更新自己的window。
上文用通俗语言表达为,一旦接收方的仓库空间小于一个标准集装箱,window size update = 0 , 即善意欺骗对方,仓库已经用完,不允许再发货物过来。

以上是从接收方入手,万一接收方没有遵守规定,那就让发送方严格执行另外一个规定。

发送方一旦发现对方的window size < MSS,理解为对方的仓库已经占满(剩余空间不足以容纳一个标准集装箱),不会发送任何集装箱。

●以太网包头(Ethernet V2 型帧)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Not all well known de facto uses of EtherTypes are always recorded in the IEEE list of EtherType values.[11] For example, EtherType 0x0806 (used by ARP) appears in the IEEE list only as “Symbolics, Inc., Protocol unavailable.”[11] However, the IEEE Registration Authority lists all the accepted EtherTypes, including the 0x0806.[5]

https://en.wikipedia.org/wiki/EtherType

在这里插入图片描述
·IPv4数据报。头部大小可变, 4位的IHL字段被限制为15个32位字(60字节)。一个典型的IPv4头部包含20字节(没有选项)。源地址和目的地址的长度为32位。第二个32位字的大部分用于IPv4分片功能。头部校验和有助于确保头部宇段被正确发送到目的地,.但不保护数据内容。

·版本号(Version):长度4bits。标识目前采用的IP协议的版本号。一般的值为0100(IPv4),0110(IPv6)

·IP包头长度(Header Length

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值