[计算机网络]IP协议
●既选择了远方,便只顾风雨兼程。
●欢迎大家有问题随时私信我!
●版权:本文由[你帅你先说.]原创,CSDN首发,侵权必究。
为您导航 2.网段划分 3.数据链路层 4.ARP协议 5.DNS
1.IP协议 1.1IP协议基本概念
IP:网络号 + 主机号
主机: 配有IP地址。
路由器: 即配有IP地址, 又能进行路由控制。
节点: 主机和路由器的统称。
1.2IP协议报头
报头的标准长度为20字节。
4位版本号(): 指定IP协议的版本,对于IPv4来说,就是4。
4位头部长度( ): IP头部的长度是多少个32bit,也就是*4的字节数。4bit表示最大的数字是15, 因此IP头部最大长度是60字节。(这点与TCP一样)
16位总长度(total ): IP数据报整体占多少个字节。
8位协议: 表示上层协议的类型。(TCP/UDP)
16位首部校验和: 使用CRC进行校验,来鉴别头部是否损坏。
8位服务类型(Type Of ): 3位优先权字段(已经弃用),4位TOS字段和1位保留字段(必须置为0)。4位TOS分别表示: 最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/这样的应用程序,最小延时比较重要。对于ftp这样的程序,最大吞吐量比较重要。
8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64。每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。
分片问题:
首先,需要强调的是IP分片不是大部分情况,是一种特殊情况。
为什么需要分片?
当数据从应用层自顶向下传输时,当传输给数据链路层时,一次传输的数据大小是有限制的,为1500字节。
所以如果传过来的数据过大,就要进行分片。
谁来进行组装?
对端的网络层来进行组装。
分片过程:
首先,网络层的报头有20字节,所以传给链路层的有效载荷最多为1480字节。
假设给网络层1500字节的数据
1500 = 1480 + 20
拆成两份数据,再分别添加20字节的报头
也就是拆成1500字节和40字节的两份数据传给链路层。
那么问题来了,分完片之后对端主机要怎么进行组合?
这里就用到了报头里的16位标识,不同报文有没有分片标识符是不一样的。如果有分片,标识符是一样的,这样就能把一个个分片聚在一起,那要怎么保证按正确的顺序把分片拼起来?这就用到了13位片偏移,我们来看张图看看是怎么使用的。
所以片偏移就是相对于起始位置偏移的字节量。
我们也发现片偏移 + 自身报文长度 = 下一个分片的开始 。
小结一下:16位标识先是把分片聚在一起,然后按偏移量的升序进行排序,最终把分片组合到一起。
问题又来了,在传输过程中怎么知道报文有没有丢?
如果是分片的第一块,我们很好判定,如果没有偏移量为0的分片则说明丢了。
如果是中间某些分片丢了,我们可以通过当前分片的自身长度加上偏移量是否等于下一个分片的偏移量来判断有没有丢。
前面两种情况都比较好处理,最担心的是最后一片分片丢弃了,这要怎么处理?可能很多人会想利用16位总长度进行判别,但当你把报文分片之后,加上报头,16位总长度描述的则是每个分片的总长度。所以这就用到了我们最后一个属性,3位标志。
3位标志:1位保留,1位标识禁止分片,1位标识更多报文。更多报文这一位如果为1表示后面还有,为0则表示后面没有。所以只要我收到了这个标识符置为1的分片,则表示最后一个分片我收到了。
问题又来了,那么对端怎么区分分片和独立的报文?相信大家很容易想到片偏移为0且更多分片标志位为0的报文就是独立报文。
分片缺点:增加了丢包的概率。当发生丢包时,对端的网络层会将整个报文全部丢弃,这样主端才会重新传送数据。
一般而言,为了减少分片,TCP会控制自己单个报文的大小。
2.网段划分 2.1IP分类
前面讲过,IP地址分为两个部分, 网络号和主机号。
网络号: 保证相互连接的两个网段具有不同的标识。
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号。
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同。但是手动管理子网内的IP是一个很复杂的过程。
所以就有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便. 一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器。
过去曾经提出一种划分网络号和主机号的方案, 把所有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
随着互联网的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址。
针对这种情况提出了新的划分方案, 称为CIDR( )。
引入一个额外的子网掩码( mask)来区分网络号和主机号。
子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾。
将IP地址和子网掩码进行 "按位与"操作, 得到的结果就是网络号。
网络号和主机号的划分与这个IP地址是A类、B类还是C类无关。
IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0,即
11 。
来看个例子:
IP:192.168.50.10
子网掩码为255.255.192.0
请写出它的CIDR表示方法
观察给定的子网掩码发现前两个都是255,所以都是全1,第三192转换为二进制为。
即
... 子网掩码
... IP地址
通过这些我们可以知道192.168就是网络号,50.10就是主机号。
子网掩码CIDR写法192.168.0.0/18。
子网地址范围:
192.168.0.0~192.168.63.255
2.2特殊的IP地址 2.3私有IP地址和公网IP地址
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址。
公网IP是唯一的不能重复的,而私有IP是可以重复的,因为私有IP是在一个局域网内有效,不同的局域网可以有相同的私有IP。
举个例子,当你想访问王者荣耀
当你将请求送达王者荣耀服务器时,服务器会给你一个响应,这时就出问题了,当服务器给你响应时发现src这套IP有很多一样的,不知道发给谁,因为src是用户的私有IP,不具有唯一性。所以正确的请求过程应该是这样的。
传输过程不断把源IP替换成WAN口IP,这种技术被称为NAT。
2.4路由
路由的过程, 就是这样一跳一跳(Hop by Hop) “问路” 的过程。
所谓 “一跳” 就是数据链路层中的一个区间。具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。
如果要发送的数据包的目的地址是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路由器。由192.168.10.1路由器根据它的路由表决定下一跳地址。
3.数据链路层 3.1以太网
“以太网” 不是一种具体的网络, 而是一种技术标准。既包含了数据链路层的内容, 也包含了一些物理层的
内容。例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等。
例如以太网中的网线必须使用双绞线。传输速率有10M, 100M, 1000M等。
以太网是当前应用最广泛的局域网技术。和以太网并列的还有令牌环网, 无线LAN等。
3.1以太网帧格式
FCS用于判断接收帧的网卡或接口是否发生了错误。
目的地址和源地址指的都是MAC地址。
MTU
MTU对UDP协议的影响
一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报。这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。
MTU对于TCP协议的影响
TCP的一个数据报也不能无限大, 还是受制于MTU。 TCP的单个数据报的最大消息长度, 称为MSS(Max Size)。
TCP在建立连接的过程中, 通信双方会进行MSS协商。
最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)。
双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值,然后双方得知对方的MSS值之后, 选择较小的作为最终MSS,MSS的值就是在TCP首部的40字节变长选项中(kind=2)。
MSS与MTU的关系
4.ARP协议
ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议。
4.1ARP协议的作用
ARP协议建立了主机IP地址和MAC地址的映射关系。
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址(MAC)。
数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址(MAC)与本机不符,则直接丢
弃。
因此在通讯前必须获得目的主机的硬件地址(MAC)。
4.2ARP协议的工作流程 源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的MAC地址是多少”并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播)。目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的MAC地址填写在应答包中。每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的MAC地址 4.3ARP数据报的格式
5.DNS
DNS( Name )是一整套从域名映射到IP的系统。
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序,但是IP地址不方便记忆。于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系。
例如:
host-a 172.123.3.3
host-b 192.31.41.4
域名
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。
例如我们非常熟悉的
www.baidu.com