TCPIP协议栈与数据包封装Word文件下载.docx
- 文档编号:21628921
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:19
- 大小:638.62KB
TCPIP协议栈与数据包封装Word文件下载.docx
《TCPIP协议栈与数据包封装Word文件下载.docx》由会员分享,可在线阅读,更多相关《TCPIP协议栈与数据包封装Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
TCP是一种面向连接的、可靠的协议,有点像打电话,双方拿起电话互通身份之后就建立了连接,然后说话就行了,这边说的话那边保证听得到,并且是按说话的顺序听到的,说完话挂机断开连接。
也就是说TCP传输的双方需要首先建立连接,之后由TCP协议保证数据收发的可靠性,丢失的数据包自动重发,上层应用程序收到的总是可靠的数据流,通讯之后关闭连接。
UDP协议不面向连接,也不保证可靠性,有点像寄信,写好信放到邮筒里,既不能保证信件在邮递过程中不会丢失,也不能保证信件是按顺序寄到目的地的。
使用UDP协议的应用程序需要自己完成丢包重发、消息排序等工作。
目的主机收到数据包后,如何经过各层协议栈最后到达应用程序呢?
整个过程如下图所示(该图出自[TCPIP])。
图36.5.Multiplexing过程
以太网驱动程序首先根据以太网首部中的“上层协议”字段确定该数据帧的有效载荷(payload,指除去协议首部之外实际传输的数据)是IP、ARP还是RARP协议的数据报,然后交给相应的协议处理。
假如是IP数据报,IP协议再根据IP首部中的“上层协议”字段确定该数据报的有效载荷是TCP、UDP、ICMP还是IGMP,然后交给相应的协议处理。
假如是TCP段或UDP段,TCP或UDP协议再根据TCP首部或UDP首部的“端口号”字段确定应该将应用层数据交给哪个用户进程。
IP地址是标识网络中不同主机的地址,而端口号就是同一台主机上标识不同进程的地址,IP地址和端口号合起来标识网络中唯一的进程。
注意,虽然IP、ARP和RARP数据报都需要以太网驱动程序来封装成帧,但是从功能上划分,ARP和RARP属于链路层,IP属于网络层。
虽然ICMP、IGMP、TCP、UDP的数据都需要IP协议来封装成数据报,但是从功能上划分,ICMP、IGMP与IP同属于网络层,TCP和UDP属于传输层。
本文对RARP、ICMP、IGMP协议不做进一步介绍,有兴趣的读者可以看参考资料。
2.以太网(RFC894)帧格式
以太网的帧格式如下所示(该图出自[TCPIP]):
图36.6.以太网帧格式
其中的源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。
用ifconfig命令看一下,“HWaddr00:
15:
F2:
14:
9E:
3F”部分就是硬件地址。
协议字段有三种值,分别对应IP、ARP、RARP。
帧末尾是CRC校验码。
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补填充位。
最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。
ifconfig命令的输出中也有“MTU:
1500”。
注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧首部的长度。
3.ARP数据报格式
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。
因此在通讯前必须获得目的主机的硬件地址。
ARP协议就起到这个作用。
源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:
FF:
FF表示广播),目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。
每台主机都维护一个ARP缓存表,可以用arp-a命令查看。
缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。
想一想,为什么表项要有过期时间而不是一直有效?
ARP数据报的格式如下所示(该图出自[TCPIP]):
图36.7.ARP数据报格式
注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
硬件类型指链路层网络类型,1为以太网,协议类型指要转换的地址类型,0x0800为IP地址,后面两个地址长度对于以太网地址和IP地址分别为6和4(字节),op字段为1表示ARP请求,op字段为2表示ARP应答。
下面举一个具体的例子。
请求帧如下(为了清晰在每行的前面加了字节计数,每行16个字节):
以太网首部(14字节)
0000:
ffffffffffff00055d6158a80806
ARP帧(28字节)
0001
0010:
08000604000100055d6158a8c0a80037
0020:
000000000000c0a80002
填充位(18字节)
007731d25010
0030:
fd7841d30000000000000000
以太网首部:
目的主机采用广播地址,源主机的MAC地址是00:
05:
5d:
61:
58:
a8,上层协议类型0x0806表示ARP。
ARP帧:
硬件类型0x0001表示以太网,协议类型0x0800表示IP协议,硬件地址(MAC地址)长度为6,协议地址(IP地址)长度为4,op为0x0001表示请求目的主机的MAC地址,源主机MAC地址为00:
a8,源主机IP地址为c0a80037(192.168.0.55),目的主机MAC地址全0待填写,目的主机IP地址为c0a80002(192.168.0.2)。
由于以太网规定最小数据长度为46字节,ARP帧长度只有28字节,因此有18字节填充位,填充位的内容没有定义,与具体实现相关。
应答帧如下:
以太网首部
00055d6158a800055da1b8400806
ARP帧
08000604000200055da1b840c0a80002
00055d6158a8c0a80037
填充位
目的主机的MAC地址是00:
a8,源主机的MAC地址是00:
a1:
b8:
40,上层协议类型0x0806表示ARP。
硬件类型0x0001表示以太网,协议类型0x0800表示IP协议,硬件地址(MAC地址)长度为6,协议地址(IP地址)长度为4,op为0x0002表示应答,源主机MAC地址为00:
40,源主机IP地址为c0a80002(192.168.0.2),目的主机MAC地址为00:
a8,目的主机IP地址为c0a80037(192.168.0.55)。
思考题:
如果源主机和目的主机不在同一网段,ARP请求的广播帧无法穿过路由器,源主机如何与目的主机通信?
4.IP数据报格式
IP数据报的格式如下(这里只讨论IPv4)(该图出自[TCPIP]):
图36.8.IP数据报格式
IP数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍。
对于IPv4,4位版本字段是4。
4位首部长度的数值是以4字节为单位的,最小值为5,也就是说首部长度最小是4x5=20字节,也就是不带任何选项的IP首部,4位能表示的最大值是15,也就是说首部长度最大是60字节。
8位TOS字段有3个位用来指定IP数据报的优先级(目前已经废弃不用),还有4个位表示可选的服务类型(最小延迟、最大呑吐量、最大可靠性、最小成本),还有一个位总是0。
总长度是整个数据报(包括IP首部和IP层payload)的字节数。
每传一个IP数据报,16位的标识加1,可用于分片和重新组装数据报。
3位标志和13位片偏移用于分片。
TTL(Timetolive)是这样用的:
源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。
协议字段指示上层协议是TCP、UDP、ICMP还是IGMP。
然后是校验和,只校验IP首部,数据的校验由更高层协议负责。
IPv4的IP地址长度为32位。
选项字段的解释从略。
想一想,前面讲了以太网帧中的最小数据长度为46字节,不足46字节的要用填充字节补上,那么如何界定这46字节里前多少个字节是IP、ARP或RARP数据报而后面是填充字节?
5.IP地址与路由
IPv4的IP地址长度为4字节,通常采用点分十进制表示法(dotteddecimalrepresentation)例如0xc0a80002表示为192.168.0.2。
Internet被各种路由器和网关设备分隔成很多网段,为了标识不同的网段,需要把32位的IP地址划分成网络号和主机号两部分,网络号相同的各主机位于同一网段,相互间可以直接通信,网络号不同的主机之间通信则需要通过路由器转发。
过去曾经提出一种划分网络号和主机号的方案,把所有IP地址分为五类,如下图所示(该图出自[TCPIP])。
图36.9.IP地址类
A类0.0.0.0到127.255.255.255
B类128.0.0.0到191.255.255.255
C类192.0.0.0到223.255.255.255
D类224.0.0.0到239.255.255.255
E类240.0.0.0到247.255.255.255
一个A类网络可容纳的地址数量最大,一个B类网络的地址数量是65536,一个C类网络的地址数量是256。
D类地址用作多播地址,E类地址保留未用。
随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址。
这种方式对网络的划分是flat的而不是层级结构(hierarchical)的,Internet上的每个路由器都必须掌握所有网络的信息,随着大量C类网络的出现,路由器需要检索的路由表越来越庞大,负担越来越重。
针对这种情况提出了新的划分方案,称为CIDR(ClasslessInterdomainRouting)。
网络号和主机号的划分需要用一个额外的子网掩码(subnetmask)来表示,而不能由IP地址本身的数值决定,也就是说,网络号和主机号的划分与这个IP地址是A类、B类还是C类无关,因此称为Classless的。
这样,多个子网就可以汇总(summarize)成一个Internet上的网络,例如,有8个站点都申请了C类网络,本来网络号是24位的,但是这8个站点通过同一个ISP(Internetserviceprovider)连到Internet上,它们网络号的高21位是相同的,只有低三位不同,这8个站点就可以汇总,在Internet上只需要一个路由表项,数据包通过Internet上的路由器到达ISP,然后在ISP这边再通过次级的路由器选路到某个站点。
下面举两个例子:
表36.1.划分子网的例子1
IP地址
140.252.20.68
8CFC1444
子网掩码
255.255.255.0
FFFFFF00
网络号
140.252.20.0
8CFC1400
子网地址范围
140.252.20.0~140.252.20.255
表36.2.划分子网的例子2
255.255.255.240
FFFFFFF0
140.252.20.64
8CFC1440
140.252.20.64~140.252.20.79
可见,IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围。
IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68,子网掩码的高24位是1,也就是255.255.255.0。
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC1918规定了用于组建局域网的私有IP地址,这些地址不会出现在Internet上,如下表所示。
∙10.*,前8位是网络号,共16,777,216个地址
∙172.16.*到172.31.*,前12位是网络号,共1,048,576个地址
∙192.168.*,前16位是网络号,共65,536个地址
使用私有IP地址的局域网主机虽然没有Internet的IP地址,但也可以通过代理服务器或NAT(网络地址转换)等技术连到Internet上。
除了私有IP地址之外,还有几种特殊的IP地址。
127.*的IP地址用于本机环回(loopback)测试,通常是127.0.0.1。
loopback是系统中一种特殊的网络设备,如果发送数据包的目的地址是环回地址,或者与本机其它网络设备的IP地址相同,则数据包不会发送到网络介质上,而是通过环回设备再发回给上层协议和应用程序,主要用于测试。
图36.10.loopback设备
还有一些不能用作主机IP地址的特殊地址:
∙目的地址为255.255.255.255,表示本网络内部广播,路由器不转发这样的广播数据包。
∙主机号全为0的地址只表示网络而不能表示某个主机,如192.168.10.0(假设子网掩码为255.255.255.0)。
∙目的地址的主机号为全1,表示广播至某个网络的所有主机,例如目的地址192.168.10.255表示广播至192.168.10.0网络(假设子网掩码为255.255.255.0)。
下面介绍路由的过程,首先正式定义几个名词:
路由(名词)
数据包从源地址到目的地址所经过的路径,由一系列路由节点组成。
路由(动词)
某个路由节点为数据报选择投递方向的选路过程。
路由节点
一个具有路由能力的主机或路由器,它维护一张路由表,通过查询路由表来决定向哪个接口发送数据包。
接口
路由节点与某个网络相连的网卡接口。
路由表
由很多路由条目组成,每个条目都指明去往某个网络的数据包应该经由哪个接口发送,其中最后一条是缺省路由条目。
路由条目
路由表中的一行,每个条目主要由目的网络地址、子网掩码、下一跳地址、发送接口四部分组成,如果要发送的数据包的目的网络地址匹配路由表中的某一行,就按规定的接口发送到下一跳地址。
缺省路由条目
路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
假设某主机上的网络接口配置和路由表如下:
$ifconfig
eth0Linkencap:
EthernetHWaddr00:
0C:
29:
C2:
8D:
7E
inetaddr:
192.168.10.223Bcast:
192.168.10.255Mask:
UPBROADCASTRUNNINGMULTICASTMTU:
1500Metric:
1
RXpackets:
0errors:
0dropped:
0overruns:
0frame:
TXpackets:
10errors:
0carrier:
collisions:
0txqueuelen:
100
RXbytes:
0(0.0b)TXbytes:
420(420.0b)
Interrupt:
10Baseaddress:
0x10a0
eth1Linkencap:
88
192.168.56.136Bcast:
192.168.56.255Mask:
603errors:
110errors:
55551(54.2Kb)TXbytes:
7601(7.4Kb)
9Baseaddress:
0x10c0
loLinkencap:
LocalLoopback
127.0.0.1Mask:
255.0.0.0
UPLOOPBACKRUNNINGMTU:
16436Metric:
37errors:
0
3020(2.9Kb)TXbytes:
3020(2.9Kb)
$route
KernelIProutingtable
DestinationGatewayGenmaskFlagsMetricRefUseIface
192.168.10.0*255.255.255.0U000eth0
192.168.56.0*255.255.255.0U000eth1
127.0.0.0*255.0.0.0U000lo
default192.168.10.10.0.0.0UG000eth0
这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到192.168.56.0/24网络。
路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发,因此下一跳地址处记为*号。
如果要发送的数据包的目的地址是192.168.56.3,跟第一行的子网掩码做与运算得到192.168.56.0,与第一行的目的网络地址不符,再跟第二行的子网掩码做与运算得到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去,由于192.168.56.0/24正是与eth1接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。
如果要发送的数据包的目的地址是202.10.1.2,跟前三行路由表条目都不匹配,那么就要按缺省路由条目,从eth0接口发出去,首先发往192.168.10.1路由器,再让路由器根据它的路由表决定下一跳地址。
6.UDP段格式
下图是UDP的段格式(该图出自[TCPIP])。
图36.11.UDP段格式
下面分析一帧基于UDP的TFTP协议帧。
0000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TCPIP 协议 数据包 封装