文章目录
- 网络层
- IP协议
- 地址管理
- 路由选择
- 数据链路层
- 以太网
- MTU
- 补充:DNS
网络层
IP协议
网络层的代表,IP协议.
- 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4。
- 4位头部长度(header length):IP头部的长度是多少个32bit,也就是 length * 4 的字节数。4bit表示最大的数字是15,因此IP头部最大长度是60字节。
- 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。
- 16位总长度(total length):IP数据报整体占多少个字节。
- 16位标识(id):唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。
- 3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记。
- 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。
- 8位生存时间(Time To Live TTL):数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。
- 8位协议:表示上层协议的类型。
- 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏。
- 32位源IP地址和32位目标IP地址:表示发送端和接收端。我们日常见到的IP地址是一串数字,那是用点分十进制来把32位,4个字节的数字给分割成4个部分.每个部分分别使用0-255十进制整数表示.
地址,期望每个设备都不相同,但是32位数字只能表示42亿9千万个数字(期望使用这个表示全世界所有的上网设备是远远不够的).
为了解决IP地址不够用的问题:
(1) 动态分配IP地址,此时就可以剩下一批IP地址,这个方案只是提高了利用率,治标不治本.
(2) NAT网络地址转换,本质是使用一个IP代表一批设备.也能大大提高IP地址的利用率,使用端口号区分.
NAT要求公网IP必须是唯一的,私网IP可以在不同的局域网中重复出现,如果某个私网里的设备想访问公网的设备,就需要对应NAT设备(路由器),把IP地址进行映射,从而完成网络访问.反之,公网设备无法直接访问私网的设备,.不同局域网的私网设备没法直接相互访问.NAT机制能够有效的解决IP不够用的问题,但是带来的副作用就是网络环境更加复杂了.
(3) IPV6 (根本上解决了IP不够用的问题) 它是使用16字节表示IP地址.它比4字节表示的地址个数多了很多.它表示的地址是42亿的4次方个.IPV6虽然很好,但是目前世界上仍然以IPV4 + NAT + 动态分配的.
地址管理
我们把一个IP地址分成两个部分.一个叫做网络号,一个叫做主机号.网络号用来标识局域网,主机号是作为局域网内部的身份区分.划分网络号和主机号是为了组网.
通过子网掩码可以区分网络号和主机号.子网掩码32个bit位, 左侧都是1,右侧都是0
1的部分就描述了IP有多少位是网络号.
特殊的IP地址:
- 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网;
- 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包;
- 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
- 本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。
路由选择
简单来说,每个路由器都会保存一定的周围设备的信息(路由表),每次有一个IP数据报经过路由器就需要匹配路由表,看看接下来怎么走,如果路由表上有匹配的项,直接按照要求走就行了,如果没有匹配的项,它会提供一个默认路径,大体方向是不会错的,沿着这个方向继续走,继续"问路".
数据链路层
数据链路层考虑相邻两个节点之间的传输,比如:通过网线/光纤/无线直接相连的两个设备.典型的协议很多,比如:“以太网”.
以太网
以太网是一个更广泛的协议,她规定了数据链路层内容,也规定了物理层的内容.咱们日常使用的网线就叫做"以太网线"(遵守以太网协议的网线)
帧头包括目的地址,源地址和类型.目的地址和源地址不是使用IP地址表示,而是搞了一个MAC地址.MAC是和IP地址完全独立的另一套地址体系.MAC地址是6个字节比IPV4地址大很多,当前每个设备都有唯一的MAC地址,它的地址不是动态分配的,而是网卡在出场的时候就被设置好了.IP和MAC各司其职,IP描述整个传输过程的起点终点,MAC则描述两个相邻节点起点终点.
普通的以太网数据帧载荷部分就是一个完整的IP数据帧.类型0806表示的是载荷部分是一个ARP报文.类型8035表示载荷部分是一个RARP报文,这俩类型就是数据链路层中的另外的协议(ARP协议).通过这个协议可以某个路由器/交换机,能够认识局域网里的其他设备,通过ARP协议会在交换机/路由器里建立出一个表.这个表相当于一个hash表,能够建立出IP和MAC之间的映射关系.
MTU
MTU相当于发快递时对包裹尺寸的限制。这个限制是不同的数据链路对应的物理层,产生的限制。
MTU是一个数据链路层的数据帧能够承载数据的最大长度(载荷的长度).载荷具体多长和使用的物理介质有很大的关系,当然和数据链路层使用的协议也有很大的关系.比如以太网协议,MTU 1500(字节).正是MTU引起了IP这个协议来进行分包组包.IP的分包组包通常不是根据这个IP最大长度64KB来分的,大概率情况下数据链路层的MTU都比64KB要小.引入MTU和物理层有很大的关系.
补充:DNS
DNS是应用层的一个协议,也是当前互联网的基石.
域名就是网址,在网络上的服务器,要访问它需要的是IP地址,但是IP地址太拗口,于是使用一些简单的单词构成字符串来表示地址,于是就有了域名,每个域名都对应了一个或N个IP地址.
既然如此,就需要能把域名和IP地址给对应上.最原始的做法是使用hosts文件(像hash表一样,建立了IP和域名的映射).
早期互联网上的服务器寥寥无几,每个用户手动维护自己的hosts文件就可以了,后来互联网飞速发展,现在网站成千上万,每天都有很多新的网站诞生,也有很多老的网站消亡,此时手工维护就很困难了.于是就有人搞了个DNS服务器.
配置DNS:
当我们访问某个域名的时候,就自动请求一下DNS服务器,DNS服务器就帮我们进行查询,把得到的结果返回给我们(结果就是具体的IP地址).如果我们电脑的DNS服务器配置的不对或者DNS服务器挂了,此时就会出现一个典型的现象:QQ能用,但是网页打不开.
对于域名:
域名分级了,DNS服务器也是分级了,有一级域名的DNS服务器,还有二级域名,三级域名.查询DNS服务器就是分级来查询的.