0
点赞
收藏
分享

微信扫一扫

【网络编程】TCP的五层协议栈之网络层、数据链路层与应用层

小北的爹 2022-05-01 阅读 50

文章目录

一、网络层

  IP协议完成两方面的工作:

  1. 地址管理
  2. 路由选择

1.协议头格式

IP协议头格式如下:
在这里插入图片描述

(1) 4位版本(version):指定IP协议的版本,对于IPv4来说,就是4;对于IPv6来说,就是6 。

(2) 4位头部长度(header length):IP头部的长度是多少个32bit,也就是 length * 4 的字节数。4bit表示最大的数字是15,因此IP头部最大长度是60字节。

(3) 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,同一时刻,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。

(4) 16位总长度(total length):IP数据报整体占多少个字节。16位=>最大长度64k。因此,单个IP数据报最大长度确实不能超过64k。如果要构造一个更长的数据报(比如搭载的载荷部分已经超过64k了,怎么办。通过IP协议自身实现的分包和组包这样的操作。

(5) 16位标识(id)、3位标志字段、13位分片偏移(framegament offset)就是用来进行分包和组包的。
在这里插入图片描述  假如我们现在有很长的一个IP数据报:

在这里插入图片描述
问题:如果区分这多个IP数据包是否从同一个数据拆分而来的呢?

答:通过16标识号,16标识号是唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。

  • 3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记。
  • 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。

(6) 8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。正常的IP数据报都会在既定的TTL内来到达。但是就是有些包里面的IP地址,可能是永远也到不了的.像这样的包,不可能在网络上无休止的转发(占用硬件资源太多了),因此需要结束它。

(7) 8位协议:表示传输层使用的协议类型。TCP与UDP都有不同的取值。

(8) 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏,也用来检验数据是否正确。

(9) 32位源地址和32位目标地址:表示发送端和接收端。对于IPv4来说,一个IP地址本质上是32位的整数。通常会使用"点分十进制"这样的方式来表示这个IP地址。三个点,把32位整数分成4个部分,每个部分1个字节.每个部分的取值就是0-255。


2.地址管理

2.1.认识IP地址

概念

格式

如:01100100.00000100.00000101.00000110。

通常用“点分十进制”的方式来表示,即 a.b.c.d 的形(a,b,c,d都是0~255之间的十进制整数)。如:100.4.5.6。

IP协议有两个版本,IPv4和IPv6。

  • IPv4数量=2^32,大约43亿左右,而TCP/IP协议规定,每个主机都需要有一个IP地址。对于全世界计算机来说,这个数量是不够的,所以后来推出了IPv6
  • IPv6(长度128位,是IPv4的4倍)。但因为目前IPv4还广泛的使用,且可以使用其他技术来解决IP地址不足的问题,所以IPv6也就没有普及。

组成

IP地址分为两个部分,网络号和主机号:

  • 网络号:标识网段,保证相互连接的两个网段具有不同的标识;
  • 主机号:标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;

通过合理设置网络号和主机号,就可以保证在相互连接的网络中,每台主机的IP地址都是唯一的。那么,如何划分网络号和主机号呢?

举个例子:我们假设有以下网络

在这里插入图片描述
问:我们是如何知道前多少个bit位是网络号的?它是如何规定的?

答:实际上,这里是通过子网掩码来进行划分的。我们需要根据实际需要来确定网段如何划分,每个设备的IP都是可配置的,包括子网掩码啥的,都是可以修改的。一般家用的场景中,一个局域网设备很少(不会超过255)常见的子网掩码就是255.255.255.0。如果一个局域网设备多了,子网掩码就会出现一些其他值。

  这是具体怎样划分,其实我们作为程序猿不用操心太多,这些事交给专业的人就行了,比如网管。不过我们下面还是简单介绍一下子网掩码吧。


2.2.子网掩码

格式:
子网掩码格式和IP地址一样,也是一个32位的二进制数。

  • 左边是网络位,用二进制数字“1”表示,1的数目等于网络位的长度;
  • 右边是主机位,用二进制数字“0”表示,0的数目等于主机位的长度。
    -子网掩码也可以使用二进制所有高位1相加的数值来表示,如以上子网掩码也可以表示为24

==作用: ==
(1)划分A,B,C三类 IP 地址子网:

  如一个B类IP地址:191.100.0.0,按A ~ E类分类来说,网络号二进制数为16位网络号+16位主机号。

  假设使用子网掩码 255.255.128.0(即17) 来划分子网,意味着划分子网后,高17位都是网络位/网络号,也就是将原来16位主机号,划分为1位子网号+15位主机号。

  此时,IP地址组成为:网络号+子网号+主机号,网络号和子网号统一为网络标识(划分子网后的网络号/网段)

在这里插入图片描述
(2)网络通信时,子网掩码结合IP地址,可以计算获得网络号(划分子网后的网络号)及主机号(划分子网后的主机号)。
  一般用于判断目的IP与本IP是否为同一个网段。对于网络通信来说,发送数据报时,目的主机与发送端主机是否在同一个网段,流程是不一样的。

计算方式:

  将 IP 地址和子网掩码进行“按位与”操作(二进制相同位,与操作,两个都是1结果为1,否则为0),得
到的结果就是网络号。
  将子网掩码二进制按位取反,再与 IP 地址位与计算,得到的就是主机号。

示例:

十进制二进制
IP地址180.210.242.13110110100.11010010.11110010.10000011
子网掩码255.255.248.011111111.11111111.11111000.00000000
网络号180.210.240.010110100.11010010.11110000.00000000
主机号0.0.2.13100000000.00000000.00000010.10000011

2.3.一些特殊的IP地址

  • 如果IP的主机号为全0,该IP就表示网络号.(局域网里的一个正常的设备,主机号不能设为О)
  • 如果IP的主机号为全1(255),该IP就表示"广播地址".往这个广播地址上发的消息,整个局域网中都能收到
  • IP地址是127开头的,该IP都表示"环回IP",表示主机自己。如:127.0.0.1 (环回IP中的典型代表)
  • IР地址是10开头,192.168 开头,172.16-172.31开头,表示该IР地址是一个局域网内部的IP(内网IP)
  • 除此之外,剩下的IP称为外网IP,也就是直接在广域网上使用的IP。我们要求外网IP一定是唯一的,每个外网IP都会对应到唯一的一个设备。
  • 内网IP只是在当前局域网中是唯一的,不同的局域网里,可以有相同的内网IP的设备。

2.4.IP地址的数量问题

  当前IPv4协议使用的IP地址是32位的整数。32位能表示的数据范围是42亿9千万。如果给每个设备都分配一个唯一的IP地址,意味着世界上的设备就不能超过42亿9千万。然而,随着网络的发展,现在世界上的设备越来越多,已经超过了42亿9千万,让每个设备都有唯一的IP地址,不现实了。

  
  那我们该如何解决这个问题呢?

(1)动态分配IP地址。让每个设备连上网的时候,才有IP,不联网的时候就没IP,于是这个IP就可以给别人用。

  但是这个方案不能从根本上解决问题,因为设备没有减少, IP地址也没有增加,治标不治本。

  

(2)NAT机制。让多个设备共用同一个IP(外网IP)

  当前网络环境把网络分成了内网(局域网)和外网(广域网)。要求外网IP必须表示唯一的设备,同时内网中的若干个设备,可以共用同一个外网IP。

  这个时候每个外网IP都可能表示着几千个,甚至上万个设备,这个时候IP地址的压力就缓解了很多了。

比如说下面这个广州的IP地址。
在这里插入图片描述
这个IP不是只给我一个人用的,而是所有接入这个运营商设备的局域网,都在共用着同一个IP。可能不只是我自己,我们整个小区,上万号人,都在使用这同一个外网IP。

  
举个例子:

  192.168.0.5。这是我自己电脑的IP。这个IP只有在我自己家里的局域网中才能访问。

  如果其他人想跨越局域网来访问我的这个IP是做不到。但如果咱们之间要想通信咋办?这就需要有一个带有外网IP的机器,比如在腾讯会议开会的时候,这个外围IP其实就是腾讯会议的服务器。

  腾讯会议服务器是有外网IP,咱们都能访问到。我这边的机器访问了 腾讯会议,把老师的电脑画面推送到腾讯会议服务器上,同学们也访问了腾讯会议,从 腾讯会议上看到了老师的直播画面。

问:如果此时腾讯会议有两个连接的IP地址都是来自223.73.64.173(上面图片的广州地区IP地址),那么该如何 区分这里面谁是谁,保证腾讯会议返回的直播数据不混淆呢?

答:这个时候得依靠端口号。网络的连接,是一个五元组。

在这里插入图片描述
  虽然两个连接的IP是一样的,但是端口号不一样。腾讯会议服务器仍然可以区分出哪个连接来自于哪个主机就可以分别返回不同的直播数据了。

  
  然而,通过NAT机制也不能从根本上解决问题,这里的问题仍然是设备没有减少, IP地址也没有增加。


(3)通过IPv6地址。

  IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址

  由于IPv4最大的问题在于网络地址资源不足,严重制约了互联网的应用和发展。

  Pv6的地址长度为128位,是IPv4地址长度的4倍。于是IPv4点分十进制格式不再适用,采用十六进制表示。

  IPv6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍。这才是从根本上解决问题的最佳途径。


3.路由选择

  IP数据报中的目的地址,就表示了这个包要发到哪里去。如果当前路由器直接认识这个目的地址,就会直接告诉你怎样走。如果当前路由器不认识,就会告诉你一个大概的方向,让你走到下一个路由器的时候再来问问。

  依次往后走,其实也是在离目标越来越近,这个时候就总会遇到一个认识这个地址的路由器。于是就可以具体的转发过去了。有的时候,不光遇到了一个认识这个地址的路由器,并且他还认识多个路,这样就可以选一个更合适的路了。

问:啥叫路由器"认识"这个IP地址?
  在路由器内部维护了一个数据结构——路由表。路由表里面就记录了一些网段信息,例如网络号、目的IP(在这些网络号中匹配),以及每个网络号对应的网络接口(网络接口其实就对应到路由器里面具体的端口)。

  这个具体了解到这里就行了,毕竟我们以后也不是搞这方面的。


二、数据链路层

1.数据链路层协议:以太网

  • “以太网” 不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容。例如:规定了网络拓扑结构,访问控制方式,传输速率等;

  • 例如以太网中的网线必须使用双绞线;传输速率有10M,100M,1000M等;

  • 以太网是当前应用最广泛的局域网技术;和以太网并列的还有令牌环网,无线LAN等;

1.1 以太网帧格式

在这里插入图片描述

  • 通过6个字节来表示源地址和目的地址。这个就要比IPv4更长,长了6w多倍。

  • 这里的地址称为"mac地址"。mac 地址做到了每个设备都是唯一的(每个网卡都是唯一的)。是在网卡出厂的时候就写死了。

1.2.mac地址

  • 主机具有一个或多个网卡,路由器具有两个或两个以上网卡;其中每个网卡都有唯一的一个MAC地址。
  • 网络通信,即网络数据传输,本质上是网络硬件设备,将数据发送到网卡上,或从网卡接收数据。
  • 硬件层面,只能基于MAC地址识别网络设备的网络物理地址。

特殊的MAC地址

  广播数据报:发送一个广播数据报,表示对同网段所有主机发送数据报。广播数据报的MAC地址为:FF:FF:FF:FF:FF:FF


回到这个以太网帧格式:

在这里插入图片描述

  • 类型:上层协议的类型。由于上层协议众多,所以在处理数据的时候必须设置该字段,标识数据交付哪个协议处理。例如,字段为 0x0800 时,表示将数据交付给 IP 协议。

  • 数据: 也称为效载荷,表示交付给上层的数据。以太网帧数据长度最小为 46 字节,最大为 1500 字节。如果不足 46 字节时,会填充到最小长度。最大值也叫最大传输单元(MTU)。在 Linux 中,使用 ifconfig 命令可以查看该值,通常为 1500。

  • CRC帧尾:检测该帧是否出现差错,占 4 个字节(32 比特)。发送方计算帧的循环冗余码校验(CRC)值,把这个值写到帧里。接收方计算机重新计算 CRC,与 FCS 字段的值进行比较。如果两个值不相同,则表示传输过程中发生了数据丢失或改变。这时,就需要重新传输这一帧。


1.3.认识MTU

  以太网是和硬件也密切相关的。不同的硬件设备对应的数据链路层协议,可能又不一样,MTU也不相同。

  MTU相当于发快递时对包裹尺寸的限制。这个限制是不同的数据链路对应的物理层产生的限制。(数据链路层考虑的是相邻节点之间的数据传输。考虑这个细节的时候就需要关注到交通工具是啥不同的交通工具,能够搭载的数据量就不太相同)

(1)MTU对IP协议的影响

如何数据报超过了MTU的范围限制,怎么办?

  由于数据链路层MTU的限制,对于较大的IP数据包要进行分包.

  • 将较大的IP包分成多个小包,并给每个小包打上标签;
  • 每个小包IP协议头的 16位标识(id) 都是相同的;
  • 每个小包的IP协议头的3位标志字段中,第2位置为0,表示允许分片,第3位来表示结束标记(当前是否是最后一个小包,是的话置为1,否则置为0);
  • 到达对端时再将这些小包,会按顺序重组,拼装到一起返回给传输层;
  • 一旦这些小包中任意一个小包丢失,接收端的重组就会失败。但是IP层不会负责重新传输数据;

在这里插入图片描述

(2)MTU对UDP协议的影响
让我们回顾一下UDP协议:

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

(3)MTU对于TCP协议的影响

让我们再回顾一下TCP协议:

  • TCP的一个数据报也不能无限大,还是受制于MTU。TCP的单个数据报的最大消息长度,称为MSS(Max Segment Size);
  • TCP在建立连接的过程中,通信双方会进行MSS协商。
  • 最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)。
  • 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。
  • 然后双方得知对方的MSS值之后,选择较小的作为最终MSS。
  • MSS的值就是在TCP首部的40字节变长选项中(kind=2);


三、应用层

应用层的重点协议

1.DNS域名解析

   域名是一个字符串,如 www.baidu.com , hr.nowcoder.com等。域名系统为一个树形结构的系统,包含多个根节点。其中:

  1. 根节点即为根域名服务器,最早IPv4的根域名服务器全球只有13台,IPv6在此基础上扩充了
    数量。
  2. 子节点主要由各级DNS服务器,或DNS缓存构成。
  • DNS域名服务器,即提供域名转换为IP地址的服务器。
  • 浏览器、主机系统、路由器中都保存有DNS缓存。
  • Windows系统的DNS缓存在 C:\Windows\System32\drivers\etc\hosts 文件中,Mac/Linux系统的DNS缓存在 /etc/hosts 文件中。

   网络通信发送数据时,如果使用目的主机的域名,需要先通过域名解析查找到对应的IP地址:

  • 域名解析的过程,可以简单的理解为:发送端主机作为域名系统树形结构的一个子节点,通过域名信息,从下到上查找对应IP地址的过程。如果到根节点(根域名服务器)还找不到,即找不到该主机。
  • 域名解析使用DNS协议来传输数据。DNS协议是应用层协议,基于传输层UDP或TCP协议来实现。

完!

举报

相关推荐

0 条评论