您的位置:首页 > 理论基础 > 计算机网络

关于TCP/IP

2016-01-17 11:00 706 查看
关于TCP/IP的几个层次,如下所示:



这其中各个层次的数据包的封装如下所示:



数据包到达之后由协议栈到达各层的过程如此啊所示:



着重要注意一下的就是以太网的帧格式问题:



其中的类型字段,主要制订了IP数据报,ARP,RARP 3中类型。

源地址及目的地址指的是网卡的硬件地址,长度为6个Byte。以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补填充位。最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。ifconfig命令的输出中也有“MTU:1500”。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧首部的长度。

对比上面的以太网帧格式,可以看一下下面的ARP数据报的格式:



源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型,1为以太网,协议类型指要转换的地址类型,0x0800为IP地址,后面两个地址长度对于以太网地址和IP地址分别为6和4(字节),op字段为1表示ARP请求,op字段为2表示ARP应答。

下面举一个对应上图的例子:

下面这个首先是请求帧:

以太网首部(14字节)
0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06
ARP帧(28字节)
0000:
00 01
0010: 08 00 06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 37
0020: 00 00 00 00 00 00 c0 a8 00 02
填充位(18字节<span style="white-space:pre">	</span>)
0020:
00 77 31 d2 50 10
0030: fd 78 41 d3 00 00 00 00 00 00 00 00
以太网首部:目的主机采用广播地址,源主机的MAC地址是00:05:5d:61:58:a8,上层协议类型0x0806表示ARP。

ARP帧:硬件类型0x0001表示以太网,协议类型0x0800表示IP协议,硬件地址(MAC地址)长度为6,协议地址(IP地址)长度为4,op为0x0001表示请求目的主机的MAC地址,源主

机MAC地址为00:05:5d:61:58:a8,源主机IP地址为c0 a8 00 37(192.168.0.55),目的主机MAC地址全0待填写,目的主机IP地址为c0 a8 00 02(192.168.0.2)。

由于以太网规定最小数据长度为46字节,ARP帧长度只有28字节,因此有18字节填充位,填充位的内容没有定义,与具体实现相关。

下面这个是应答帧:

以太网首部(14字节)
0000: 00 05 5d 61 58 a8 00 05 5d a1 b8 40 08 06
ARP帧(28字节)
0000:
00 01
0010: 08 00 06 04 00 02 00 05 5d a1 b8 40 c0 a8 00 02
0020: 00 05 5d 61 58 a8 c0 a8 00 37
填充位(18字节) //没什么具体的意义
0020:
00 77 31 d2 50 10
0030: fd 78 41 d3 00 00 00 00 00 00 00 00
以太网首部:目的主机的MAC地址是00:05:5d:61:58:a8,源主机的MAC地址是00:05:5d:a1:b8:40,上层协议类型0x0806表示ARP。

ARP帧:硬件类型0x0001表示以太网,协议类型0x0800表示IP协议,硬件地址(MAC地址)长度为6,协议地址(IP地址)长度为4,op为0x0002表示应答,源主机MAC地址为00:05:5d:a1:b8:40,源主机IP地址为c0 a8 00 02(192.168.0.2),目的主机MAC地址为00:05:5d:61:58:a8,目的主机IP地址为c0 a8 00 37(192.168.0.55)。

有个问题,源主机和目的主机不在同一网段,ARP请求的广播帧无法穿过路由器,源主机如何与目的主机通信?

方法就是: 源主机、目的主机不在同一网段时,源主机会出ARP广播去获取网关的MAC地址,网关会应答ARP,这样源主机就获得了网关的MAC地址。然后源主机发送数据包,数据包中IP部分的目的IP地址是目的主机的IP地址,数据包的目的MAC地址是网关的MAC地址。这样网关收到你的数据包,再根据目的IP发送到下一个出口。

IP数据报的格式:



上图中对于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(Time
to live)是这样用的:源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。协议字段指示上层协议是TCP、UDP、ICMP还是IGMP。然后是校验和,只校验IP首部,数据的校验由更高层协议负责。IPv4的IP地址长度为32位。

IP地址简介:

Internet被各种路由器和网关设备分隔成很多网段,为了标识不同的网段,需要把32位的IP地址划分成网络号和主机号两部分,网络号相同的各主机位于同一网段,相互间可以直接通信,网络号不同的主机之间通信则需要通过路由器转发。



随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址。这种方式对网络的划分是flat的而不是层级结构(hierarchical)的,Internet上的每个路由器都必须掌握所有网络的信息,随着大量C类网络的出现,路由器需要检索的路由表越来越庞大,负担越来越重。针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)。网络号和主机号的划分需要用一个额外的子网掩码(subnet
mask)来表示,而不能由IP地址本身的数值决定,也就是说,网络号和主机号的划分与这个IP地址是A类、B类还是C类无关,因此称为Classless的。这样,多个子网就可以汇总(summarize)成一个Internet上的网络,例如,

有8个站点都申请了C类网络,本来网络号是24位的,但是这8个站点通过同一个ISP(Internetservice provider)连到Internet上,它们网络号的高21位是相同的,只有低三位不同,这8个站

点就可以汇总,在Internet上只需要一个路由表项,数据包通过Internet上的路由器到达ISP,然后在ISP这边再通过次级的路由器选路到某个站点。

举几个例子来看,

IP地址             140.252.20.68 8C FC 14 44
子网掩码         255.255.255.0 FF FF FF 00
网络号             140.252.20.0 8C FC 14 00
子网地址范围  140.252.20.0~140.252.20.255
IP地址             140.252.20.68 8C FC 14 44
子网掩码         255.255.255.240 FF FF FF F0
网络号             140.252.20.64 8C FC 14 40
子网地址范围  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。

RFC 1918规定了用于组建局域网的私有IP地址,这些地址不会出现在Internet上,如下表所示。这些地址专门用于组织局域网使用:

10.*,前8位是网络号,共16,777,216个地址
172.16.*到172.31.*,前12位是网络号,共1,048,576个地址
192.168.*,前16位是网络号,共65,536个地址
其他的特殊的ip地址还有:

1. 127.*的IP地址用于本机环回(loop back)测试,

通常是127.0.0.1。loopback是系统中一种特殊的网络设备,如果发送数据包的目的地址是环回地址,或者与本机其它网络设备的IP地址相同,则数据包不会发送到网络介质上,而是通过环回设备再发回给上层协议和应用程序,主要用于测试。环回的过程具体的如下所示:



2. 目的地址为255.255.255.255,表示本网络内部广播,路由器不转发这样的广播数据包。

3. 主机号全为0的地址只表示网络而不能表示某个主机,如192.168.10.0(假设子网掩码为255.255.255.0)。

4.目的地址的主机号为全1,表示广播至某个网络的所有主机,例如目的地址192.168.10.255表示广播至192.168.10.0网络(假设子网掩码为255.255.255.0)。

关于路由的相关知识如下所示:

路由(名词)

数据包从源地址到目的地址所经过的路径,由一系列路由节点组成。

路由(动词)

某个路由节点为数据报选择投递方向的选路过程。

路由节点

一个具有路由能力的主机或路由器,它维护一张路由表,通过查询路由表来决定向哪个接

口发送数据包。

接口

路由节点与某个网络相连的网卡接口。

路由表

由很多路由条目组成,每个条目都指明去往某个网络的数据包应该经由哪个接口发送,其中最后一条是缺省路由条目。

路由条目

路由表中的一行,每个条目主要由目的网络地址、子网掩码、下一跳地址、发送接口四部分组成,如果要发送的数据包的目的网络地址匹配路由表中的某一行,就按规定的接口发送到下一跳地址。

缺省路由条目

路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。

本机上的网络情况以及路由表如下所示:

root@wc:~# ifconfig
eth0      Link encap:以太网  硬件地址 00:0c:29:f1:ad:f6
inet 地址:192.168.31.131  广播:192.168.31.255  掩码:255.255.255.0
inet6 地址: fe80::20c:29ff:fef1:adf6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
接收数据包:44422 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:32434 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:18333054 (18.3 MB)  发送字节:11250334 (11.2 MB)

lo        Link encap:本地环回
inet 地址:127.0.0.1  掩码:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING  MTU:65536  跃点数:1
接收数据包:3622 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:3622 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:305815 (305.8 KB)  发送字节:305815 (305.8 KB)

root@wc:~# route
内核 IP 路由表
目标            网关            子网掩码        标志  跃点   引用  使用 接口
default         192.168.31.2    0.0.0.0         UG    0      0        0 eth0
192.168.31.0    *               255.255.255.0   U     1      0        0 eth0
root@wc:~#
我这台主机的网络接口连到192.168.31.0接口。路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发,因此下一跳地址处记为*号。

如果想发消息的ip地址是192.168.31.4,那么与第二行的子网掩码做与,得到192,168,31.0得到确实是从这个地址发出,如果要发送的数据包的目的地址是202.10.1.2,跟路由表条目都不匹配,那么就要按缺省路由条目,从eth0接口发出去,首先发往192.168.10.1路由器,再让路由器根据它的路由表决定下一跳地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: