比如新建了一个内网,如果一台机器A找机器B,封FRAME时(OSI的第二层用的数据格式),要封装对方的MAC,开始时A不知道B的MAC,只知道IP,它就发一个ARP包,源IP是自己的,目的IP是B的,源MAC是自己的,目的MAC是广播的。然后这个请求包在内网内被广播,当其他机器接到这个包时,用目的IP和自己的IP比较,不是的话就丢弃。B接到时,发现IP与自己的一样,就答应这个包的请求,把自己的MAC送给A。如果B是其他子网的机器,那么路由器会判断出B是其他子网,然后路由器把自己的MAC返回给A,A以后再给B发包时,目的MAC封装的是路由器的。
而局域网中任意时刻只能有一个主机发送消息,如果有多个消息被同时发送,会导致局域网的数据发生碰撞,发送无效,所以就有了以太网、令牌环网标准
令牌环网:局域网中持有令牌的人才可以放松消息
以太网:检测到发生碰撞,数据链路层协议就触发策略,暂时先不发送数据,等待一段时间,然后继续检测,这种策略称为:碰撞检测和碰撞避免算法
局域网通信的协议通常使用以太网协议
局域网不能太大,因为碰撞基数太大,发送碰撞的概率就增加了,那如果局域网就是很大该怎么办?我们可以使用交换机,
交换机:可以识别局部性碰撞,对碰撞数据不进行转发,划分碰撞域
目的地址和源地址是指网卡的硬件地址,也叫MAC地址,长度是48位,是在网卡出厂时固定的;
帧协议类型字段有三种值,分别对应IP、ARP、RARP;
帧末尾是CRC校验码;
1.如何分离
由于以太网帧的首部与末尾的字段都是定长的,可以直接拿到以太网帧中的数据。
2.如何分用
根据报头中 类型 字段,将有效载荷交付给上层对应的协议。
在局域网当中,在任何时刻,只能有一个主机发送消息,如果多个消息被同时发送,会导致局域网中的数据发生碰撞,我们把一个局域网称为一个碰撞域
3.因为有碰撞域,一台主机发送数据的时候,是长了好还是短了好?
仔细看上图,规定为46-1500字节(MTU),如果小于46字节时,他会进行填充
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;
最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
不同的数据链路层标准的MTU是不同的;
1.分片是只会在发送端分片吗?
并不是,在途中的路由器也可能会分片,不同的数据链路层标准的MTU是不同的
分片既然是不好的行为,那么我们该如何尽力避免分片呢?不知道大家还记不记得TCP的滑动窗口,滑动窗口为什么不一下把一大串数据全部发出去,而是分成很多段在发送出去,原因就在这里,一个数据包的最大长度称为MSS
UDP协议:
一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.
这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了.
TCP协议:
TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(MaxSegment Size);
TCP在建立连接的过程中, 通信双方会进行MSS协商.
最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.
然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.
MSS的值就是在TCP首部的40字节变长选项中(kind=2)
虽然我们在这里介绍ARP协议, 但是需要强调, ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议;
ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.
下面这张图,展现了为什么说ARP协议是工作在网络层和数据链路层之间的协议
如果帧类型是IP类型则会直接向上分用,但如果是ARP请求,则不会继续向上了
这样的话很容易被中间人窃取,但是有了CA证书等,中间人拿到了以后也无法解密
DNS:域名解析系统
DNS是一整套从域名映射到IP的系统,TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆.于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系
DNS使用的是UDP协议
这个视频讲解的很好https://www.bilibili.com/video/BV1JZ4y1f7tU/?spm_id_from=333.337.search-card.all.click&vd_source=21f3027af56b85726fe87ebf679e81d1
ICMP协议是一个 网络层协议
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因
ICMP正是提供这种功能的协议; ICMP主要功能包括:
确认IP包是否成功到达目标地址.
通知在发送过程中IP包被丢弃的原因.
ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;
ICMP大概分为两类报文:
一类是通知出错原因
一类是用于诊断查询
1.有些面试官可能会问: telnet是23端口, ssh是22端口, 那么ping是什么端口?
ping命令基于ICMP, 是在网络层. 而端口号, 是传输层的内容. 在ICMP中根本就不关注端口号这样的信息.