目录
C语言总结 在这 常见八大排序 在这
作者和朋友建立的社区: 非科班转码社区-CSDN社区云 💖 💛 💙
期待hxd的支持哈 🎉 🎉 🎉
最后是打鸡血环节: 想多了都是问题,做多了都是答案 🚀 🚀 🚀
最近作者和好友建立了一个公众号
公众号介绍:
专注于自学编程领域。由USTC、WHU、SDU等高校学生、ACM竞赛选手、CSDN万粉博主、双非上岸BAT学长原创。分享业内资讯、硬核原创资源、职业规划等,和大家一起努力、成长。( 二维码在文章底部哈! )
以太网
- "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
- 例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
- 以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;
以太网帧格式
- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;
- 帧协议类型字段有三种值,分别对应IP、ARP、RARP;
- 帧末尾是CRC校验码。
MAC地址
- MAC地址用来识别数据链路层中相连的节点;
- 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19);
- 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址);
一般MAC地址是说全球唯一的,其实只要保证在局域网内唯一就可以了。
对比理解MAC地址和IP地址
IP地址描述的是路途总体的 起点 和 终点;MAC地址描述的是路途上的每一个区间的起点和终点;IP:是提供一种能力,是根据路径选择跨网络把数据从A传到B,但是AB一般不在一个网络/段,一个局域网里面有多台主机/路由器,这下一跳给谁就是网络层的工作。(寻找路径的能力)
MAC:路由选择你是要先把数据传送到路由器,也就是一跳一跳的过程,这就是数据链路层要做的事情。(局域网中走路的能力)
PS:传输层就是提供传输数据的可靠性(滑动窗口里面存有已经发送但是没有应答的数据,是为了可能再次发送而保留)。
所以这三层协议就保证了把数据从A可靠的传输到B的能力。应用层的作用就是对数据进行解析和处理,物理层就是网卡,但是我们一般不考虑。局域网通信原理
局域网的每台主机都有自己的MAC地址,大家可以直接进行通信(就相当于大家连接了同一条数据线/网线),也就是说局域网中的每台主机,已经看到了同一份资源(网线)。
每台主机发送消息,都是发送到这跟数据线,也就是说,局域网所有主机都可以也都要接受这个数据据(不考虑物理层,就是数据链路层先获取到数据),然后每一个主机数据链路层协议的解析和分用(MAC协议是固定大小,直接解析,协议里面有源MAC和目的MAC地址里面的类型字段就用来分用),看是不是发给自己的(目的MAC不相等,直接丢弃,是自己就向上交付)!
(PS:哪怕不是发给自己的,也可以不丢,网卡里面有一个模式是混杂模式,就是对数据不做数据甄别,局域网的数据直接向上交付,这也就是抓包的原理(一般的抓包工具会自动设置这个模式))
数据碰撞
就是一个局域网里面多个主机都在发送数据,导致数据互相干扰。也就是说任何一个时间,只允许一台主机在碰撞域里面发送消息。
碰撞避免
所以我们就需要碰撞的主机随机休眠一段时间再去发送数据避免碰撞。
碰撞域
就是局域网里面可能发送碰撞的主机的集合。
交换机
我们有一个设备(交换机),工作在数据链路层,是一个桥设备,可以把一个大的局域网划分为n个区域,同一个区域内发送消息,如果不需要跨区域那数据就不会去扩散也就是说其他区域的主机接受不到这个数据,同一个区域内发生碰撞了也不会把碰撞的数据报扩散到其他区域来影响别人,如果说是跨区域,那么就是正常的局域网通信。这样就减少了碰撞域的体积!一定程度上减少主机碰撞的可能性。
软件上进行减少配碰撞避免的策略
一般MAC帧的体积不要过大,也就是MAC协议对上提要求,就是上层的MTU(一般1500byte)去限制网络层发送的数据(让他去分片)。
到现在我们其实还有一个问题
就是我们只知道主机C的IP地址,并不知道他的MAC地址,但是数据传输是封装成MAC帧,根据MAC地址来传输的,所以必须要知道对方的MAC地址!
我们如何确认同一个局域网中对方的MAC地址
ARP协议(地址解析协议):将IP转化MAC地址。
PS:虽然我们到路由器并不知道C主机的MAC地址,但是由于是在同一个局域网,所以是有方法让C得到数据的。ARP协议
虽然我们在这里介绍 ARP 协议 , 但是需要强调 , ARP 不是一个单纯的数据链路层的协议 , 而是一个介于数据链路层和网络层之间的协议;ARP协议的作用
ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.
- 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
- 因此在通讯前必须获得目的主机的硬件地址;
ARP协议的工作流程
- 源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”, 并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
- 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;
- 每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址;
ARP数据报的格式
- 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的;
- 硬件类型指链路层网络类型,1为以太网;
- 协议类型指要转换的地址类型,0x0800为IP地址;
- 硬件地址长度对于以太网地址为6字节;
- 协议地址长度对于和IP地址为4字节;
- op字段为1表示ARP请求,op字段为2表示ARP应答;
关于OP
任何一台主机都可能向别人发起arp,也就是说
1. 任何一台主机,可能在发起arp,也可在接收arp应答。
2. 任何一台主机都可能被发起arp请求。
-》任何一台主机,发出:一定是arp请求
接受:1. 别人向我发起的arp请求 2. 我向别人发起arp请求时,得到的arp响应。
OP-》1表示请求 2表示应答发送arp与接收
ARP协议也属于数据链路层的协议,但是在内部,ARP是在MAC帧协议的上层。
发送:
发送数据的时候,MAC协议的目的MAC地址设置为全F,即是广播,所以局域网内的所有主机都要接受,然后解开MAC帧,把有效载荷交付给上层ARP协议,然后先看op,是不是1(ARP请求),然后看目的IP是不是自己(所以说接收数据的时候,在ARP层就把数据丢弃了(不匹配的话)),然后目的主机就会构建ARP应答返回。
返回:
然后匹配的主机就要返回ARP应答,就把自己的MAC地址和发送方的MAC地址都填上去了(接受的时候目的MAC是全F--广播),所以再发送回去的时候,一样是局域网的主机都收到消息,但是解析MAC帧协议的时候就会发现目的MAC地址不是自己,直接丢弃数据,这次丢弃是在MAC帧层丢弃的!最开始发送方的主机就接收到了返回的应答,先看op,发现是2(应答),然后得到了目的主机的MAC地址,就可以直接定向通信了!(并不是每次发送消息都要发送arp请求,OS会存储一个arp缓存表(一段时间),里面是IP和MAC地址的对应关系,arp -a 查看)(arp的过程是有可能在传输过程中的每一个局域网中发生的)
(OP的作用就是让主机知道消息是数据请求还是自己曾经请求返回的应答)MTU
MTU 相当于发快递时对包裹尺寸的限制 . 这个限制是不同的数据链路对应的物理层 , 产生的限制。以太网帧中的数据长度规定最小 46 字节 , 最大 1500 字节 ,ARP 数据包的长度不够 46 字节 , 要在后面补填充位;最大值 1500 称为以太网的最大传输单元 (MTU), 不同的网络类型有不同的 MTU;如果一个数据包从以太网路由到拨号链路上 , 数据包长度大于拨号链路的 MTU 了 , 则需要对数据包进行分片(fragmentation);不同的数据链路层标准的 MTU 是不同的 ;MTU对IP协议的影响
由于数据链路层 MTU 的限制 , 对于较大的 IP 数据包要进行分包。
- 将较大的IP包分成多个小包, 并给每个小包打上标签;
- 每个小包IP协议头的 16位标识(id) 都是相同的;
- 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为0, 否则置为1);
- 到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
- 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据;
MTU对UDP协议的影响
让我们回顾一下 UDP 协议 :
- 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报。
- 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。
MTU对于TCP协议的影响
让我们再回顾一下 TCP 协议 :
- TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(MaxSegment Size);
- TCP在建立连接的过程中, 通信双方会进行MSS协商;
- 最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU);
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值;
- 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS;
- MSS的值就是在TCP首部的40字节变长选项中(kind=2);
MSS和MTU的关系
查看硬件地址和MTU
使用ifconfifig命令, 即可查看ip地址, mac地址, 和MTU;
最后的最后,创作不易,希望读者三连支持💖
赠人玫瑰,手有余香💖