Linux网络编程_06_数据链路层MAC帧协议

Linux网络编程总目录(点击下面链接即可到达对应章节)

Linux网络编程_01_网络基础
Linux网络编程_02_socket套接字
Linux网络编程_03_应用层HTTP协议
Linux网络编程_04_传输层UDP和TCP协议
Linux网络编程_05_网络层IP协议
Linux网络编程_06_数据链路层MAC帧协议
Linux网络编程_07_多路转接

一. 认识以太网

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

二. 以太网帧格式

2.1 帧格式

  • 源地址和目的地址是指网卡的硬件地址(MAC地址),长度是48位,是在网卡出厂时固化的
  • 帧协议类型字段有三种值,分别对应IP数据报(0800)、ARP(0806)、RARP(0835)
  • CRC(Cyclic Redundancy Check),循环冗余校验码,用来检测或校验数据传输或者保存后可能出现的错误

在这里插入图片描述

2.2 解包和交付

解包: 以太网数据帧的格式是固定的,前面14字节,中间是数据,后面4字节的CRC校验,按照这个格式去截取数据就可以完成解包了

交付: 根据帧头的类型,如果是0800就交付给网络层的IP协议处理,如果是0806或者0835就ARP或者RARP协议处理

三. MTU

3.1 简述

以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,CentOS7默认为1500字节(数据帧的数据部分)。如果一个数据报从以太网路由到拨号链路上,长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation),不同的数据链路层标准的MTU是不同的。

3.2 MTU对IP协议的影响

将较大的IP包分成多个小包,到达对端时再将这些小包,会按顺序重组, 拼装到一起返回给传输层。一旦这些小包中任意一个小包丢失,接收端的重组就会失败,但是IP层不会负责重新传输数据。

3.3 MTU对UDP协议的影响

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

3.4 MTU对TCP协议的影响

TCP数据段也是受制于MTU的, TCP的单个数据段的最大消息长度称为MSS(Max Segment Size)。如图所示,MTU减去IP和TCP的头部部分,剩下的就是MSS。TCP在建立连接的过程中,通信双方会进行MSS协商。双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值,然后双方得知对方的MSS值之后,选择较小的作为最终MSS。MSS的值就是在TCP首部的40字节变长选项中(kind=2)。了。

在这里插入图片描述

四. ARP协议

4.1 简介

ARP(Address Resolution Protocol地址解析协议),是一个介于数据链路层和网络层之间的协议,它建立了主机 IP地址和MAC地址的映射关系。在两台主机进行局域网通信时,可以先用IP通过ARP协议获取目的主机的MAC地址,再进行正常的通信。

4.2 ARP格式

  • 硬件类型:链路层网络类型,1为以太网
  • 协议类型: 要转换的地址类型,0x0800为IP地址
  • 硬件地址长度: 以太网地址为6字节
  • 协议地址长度: IP地址为4字节
  • op字段: 为1表示ARP请求,op字段为2表示ARP应答

在这里插入图片描述

4.3 ARP协议的工作流程

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

五. DNS协议

DNS(Domain Name System域名系统),是一整套从域名映射到IP的系统。像www.baidu.com就是一个域名,这个域名映射着我们访问的网站的IP地址,当我们在浏览器输入域名回车之后,DNS会将域名转化成对应的IP地址,然后再根据IP地址去访问对应的网站。在DNS协议提出之前,域名和IP的映射关系会保持到hosts文件里面,接入新的网络时会将新的映射关系在hosts更新,同时计算机也会定期从互联网上下载最新的hosts文件以确保用户可以正常地上网,现在Linux系统依然保留着hosts文件,CentOS下的路径为/etc/hosts。

六. ICMP协议

6.1 简述

ICMP协议是一个网络层协议,在IP的上面。一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通。但是IP协议并不提供可靠传输, 如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因,ICMP正是提供这种功能的协议。 ICMP主要功能有,确认IP包是否成功到达目标地址,通知在发送过程中IP包被丢弃的原因。ICMP也是基于IP协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议。ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要是用ICMPv6。ICMP大概分为两类报文,一类是通知出错原因,一类是用于诊断查询。

6.2 ping命令

ping命令不光能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期)。ping命令会先发送一个ICMP Echo Request给对端,对端接收到之后,会返回一个ICMP Echo Reply。ping命令是绕过传输层的,所以ping命令是不需要端口号的。

七. NAT技术

7.1 简述

NAT是一种将私有IP和全局IP相互转化的技术,本地地址(私有IP地址)的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全局的IP地址,才能和因特网连接。如下图所示,搭载NAT技术的路由器里面会维护着一张转换表,而对外转化后的IP地址是子网所有主机共用的,如图中转换后都是202.244.174.37。为了让每一台子网主机转换后得到的是转换表里唯一的地址,所以采用的是IP+port的映射关系。如图虽然他们的IP是一样的,但是port不一样,所以在接收到外面来的数据时,路由器就知道交付给哪台主机了。

在这里插入图片描述

7.2 NAT的缺点

  • 无法从 NAT 的外部向内部服务器建立连接(NAT穿越)

  • 维护转换表需要一定的开销

  • 通信过程中一旦 NAT 遇到异常需重新启动时,所有的 TCP 连接都将被重置。即使备置两台 NAT 做容灾备份,TCP 连接还是会被断开。

7.3 代理服务器

7.3.1 简述

代理服务器看起来和NAT设备有一点像,客户端像代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器,服务器返回结果后,代理服务器又把结果回传给客户端

7.3.2 正向代理

正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

正向代理的特点

  • 访问原来无法访问的资源(例如google)
  • 可以做缓存,加速访问资源
  • 对客户端访问授权,上网进行认证
  • 对内可以记录用户访问记录,对外隐藏用户信息

在这里插入图片描述

7.3.3 反向代理

反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

反向代理的特点

  • 保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击大型网站,通常将反向代理作为公网访问地址,Web服务器是内网。
  • 负载均衡,通过反向代理服务器来优化网站的负载

7.3.4 正向和方向代理对比

正向代理: client和代理服务器处于同一局域网,server是透明的

反向代理: server和代理服务器处于同一局域网,client是透明的

7.3.5 NAT和代理服务器

  • 从应用上讲, NAT设备是网络基础设备之一,解决的是IP不足的问题。代理服务器则是更贴近具体应用,比如通过代理服务器进行科学上网,另外像迅游这样的加速器,也是使用代理服务器
  • 从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换,代理服务器往往工作在应用层
  • 从使用范围上讲,NAT一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网
  • 从部署位置上看, NAT一般集成在防火墙,路由器等硬件设备上, 代理服务器则是一个软件程序,需要部署在服务器上

下一章节点击我直达 --> Linux网络编程_07_多路转接

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
boost_1_75_0是一个开源的C++库,它为C++编程提供了许多功能强大的工具和解决方案。它包含了一系列模块,涵盖了各种应用于C++开发的领域,从常用的数据结构和算法,到并发编程、函数对象和数学运算等方面。 boost_1_75_0的一个主要特点是跨平台性,它可以在多个操作系统和编译器上运行,例如Windows、LinuxMac OS等。这使得它成为了许多C++开发者首选的库,无论他们是在桌面应用、嵌入式系统还是网络应用领域工作。 boost_1_75_0的使用非常简单,只需要将库的头文件包含到代码中,并链接相应的库文件即可。在使用boost_1_75_0的过程中,我们可以享受到它提供的丰富而强大的功能。比如,它提供了各种容器类、字符串处理函数和正则表达式库,可以极大地方便我们在C++项目中处理数据和字符串。此外,它还提供了智能指针、线程和同步原语等工具,用于简化并发编程的开发。 除了基本功能之外,boost_1_75_0还包含了一些高级特性,扩展了C++的功能。例如,它提供了一系列的函数对象,并支持函数式编程和Lambda表达式。还有基于模板的元编程工具,可以实现泛型编程的高效实现。同时,boost_1_75_0还提供了数学计算、图像处理网络编程等领域的库,方便开发者解决各种实际问题。 总之,boost_1_75_0是一个功能强大且易于使用的C++库,它可以为我们的C++项目提供各种有用的工具和解决方案。无论是初学者还是有经验的开发者,都可以从中受益,并提高他们的编程效率和项目质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柿子__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值