• [计算机网络]IP协议


    ●🧑个人主页:你帅你先说.
    ●📃欢迎点赞👍关注💡收藏💖
    ●📖既选择了远方,便只顾风雨兼程。
    ●🤟欢迎大家有问题随时私信我!
    ●🧐版权:本文由[你帅你先说.]原创,CSDN首发,侵权必究。

    1.IP协议

    1.1IP协议基本概念

    在这里插入图片描述
    IP:网络号 + 主机号
    主机: 配有IP地址。
    路由器: 即配有IP地址, 又能进行路由控制。
    节点: 主机和路由器的统称。

    1.2IP协议报头

    在这里插入图片描述
    报头的标准长度为20字节。
    4位版本号(version): 指定IP协议的版本,对于IPv4来说,就是4。
    4位头部长度(header length): IP头部的长度是多少个32bit,也就是length*4的字节数。4bit表示最大的数字是15, 因此IP头部最大长度是60字节。(这点与TCP一样)
    16位总长度(total length): IP数据报整体占多少个字节。
    8位协议: 表示上层协议的类型。(TCP/UDP)
    16位首部校验和: 使用CRC进行校验,来鉴别头部是否损坏。
    8位服务类型(Type Of Service): 3位优先权字段(已经弃用),4位TOS字段和1位保留字段(必须置为0)。4位TOS分别表示: 最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要。对于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(Classless Interdomain Routing)。

    引入一个额外的子网掩码(subnet 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,即
    11111111 11111111 11111111 00000000。
    来看个例子:
    IP:192.168.50.10
    子网掩码为255.255.192.0
    请写出它的CIDR表示方法
    观察给定的子网掩码发现前两个都是255,所以都是全1,第三192转换为二进制为11000000。

    11111111.11111111.11000000.00000000 子网掩码
    xxxxxxxx.xxxxxxxx.00110010.xxxxxxxx IP地址
    通过这些我们可以知道192.168就是网络号,50.10就是主机号。
    子网掩码CIDR写法192.168.0.0/18。
    子网地址范围:
    192.168.0.0~192.168.63.255

    2.2特殊的IP地址

    • 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网。
    • 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包。
    • 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1

    2.3私有IP地址和公网IP地址

    如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址。

    • 10.*,前8位是网络号,共16,777,216个地址
    • 172.16.到172.31.,前12位是网络号,共1,048,576个地址。
    • 192.168.*,前16位是网络号,共65,536个地址。
    • 包含在这个范围中的,都成为私有IP,其余的则称为全局IP(或公网IP)。

    公网IP是唯一的不能重复的,而私有IP是可以重复的,因为私有IP是在一个局域网内有效,不同的局域网可以有相同的私有IP。
    举个例子,当你想访问王者荣耀
    在这里插入图片描述
    当你将请求送达王者荣耀服务器时,服务器会给你一个响应,这时就出问题了,当服务器给你响应时发现src这套IP有很多一样的,不知道发给谁,因为src是用户的私有IP,不具有唯一性。所以正确的请求过程应该是这样的。
    在这里插入图片描述
    传输过程不断把源IP替换成WAN口IP,这种技术被称为NAT

    2.4路由

    路由的过程, 就是这样一跳一跳(Hop by Hop) “问路” 的过程。
    所谓 “一跳” 就是数据链路层中的一个区间。具体在以太网中指从源MAC地址目的MAC地址之间的帧传输区间。
    在这里插入图片描述

    • 当IP数据包, 到达路由器时, 路由器会先查看目的IP。
    • 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器。
    • 依次反复, 一直到达目标IP地址。
    • 路由表可以使用route命令查看。
    • 如果目的IP命中了路由表, 就直接转发即可。
      路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。

    在这里插入图片描述

    • 这台主机有两个网络接口,一个网络接口连到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路由器。由192.168.10.1路由器根据它的路由表决定下一跳地址。

    3.数据链路层

    3.1以太网

    “以太网” 不是一种具体的网络, 而是一种技术标准。既包含了数据链路层的内容, 也包含了一些物理层的
    内容。例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等。
    例如以太网中的网线必须使用双绞线。传输速率有10M, 100M, 1000M等。
    以太网是当前应用最广泛的局域网技术。和以太网并列的还有令牌环网, 无线LAN等。

    3.1以太网帧格式

    在这里插入图片描述
    FCS用于判断接收帧的网卡或接口是否发生了错误。
    目的地址和源地址指的都是MAC地址。
    MTU

    • 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位。
    • 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。
    • 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。
    • 不同的数据链路层标准的MTU是不同的。

    MTU对UDP协议的影响

    一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报。这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。

    MTU对于TCP协议的影响

    TCP的一个数据报也不能无限大, 还是受制于MTU。 TCP的单个数据报的最大消息长度, 称为MSS(Max Segment 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协议的工作流程

    1. 源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的MAC地址是多少”并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播)。
    2. 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的MAC地址填写在应答包中。
    3. 每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的MAC地址

    4.3ARP数据报的格式

    在这里插入图片描述

    • 硬件类型指链路层网络类型,1为以太网。
    • 协议类型指要转换的地址类型,0x0800为IP地址。
    • op字段为1表示ARP请求,op字段为2表示ARP应答处理ARP数据报的方式是先看OP字段再看IP地址。

    5.DNS

    DNS(Domain Name System)是一整套从域名映射到IP的系统。
    TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序,但是IP地址不方便记忆。于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系。
    例如:
    host-a 172.123.3.3
    host-b 192.31.41.4
    域名
    主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。
    例如我们非常熟悉的

    www.baidu.com
    
    • 1
    • com: 一级域名。表示这是一个企业域名,同级的还有 “net”(网络提供商), “org”(非盈利组织) 等。
    • baidu:二级域名, 公司名。
    • www: 只是一种习惯用法,之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议。
  • 相关阅读:
    博客项目(前台功能实现)
    react-通过useRef完成倒计时60秒发送验证码效果
    Django里的模板变量
    关于Python函数的几点说明
    高等教育心理学:学生的个性与社会性的发展
    C++——多态
    nodejs+vue+elementui房屋租赁网站系统 python协同过滤推荐系统
    C语言指针基础篇
    NNDL 实验四 线性分类
    NoSQL:非关系型数据库分类
  • 原文地址:https://blog.csdn.net/qq_52363432/article/details/126405471