Open hankviv opened 4 years ago
通讯示例:
只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。 对 TCP 协议来说,三次握手也好,重试也好,只要想发出去包,就要有 IP 层和 MAC 层,不然是发不出去的。
物理层: 水晶头的第 1、2 和第 3、6 脚,它们分别起着收、发信号的作用。将一端的 1 号和 3 号线、2 号和 6 号线互换一下位置,就能够在物理层实现一端发送的信号,另一端能收到。 集线器Hub,这种设备有多个口,可以将多台电脑连接起来。和交换机不同,集线器没有大脑,它完全在物理层工作。Hub采取的是广播的模式,每一台电脑发的包会发给所有端口的设备。
数据链路层(MAC层) MAC地址: MAC地址是48位的(6个字节),通常表示为12个16进制数,如08:00:20:0A:8C:6D 就是一个MAC地址。其前3字节(24位)表示给不同厂家分配的代码,区分不同的厂家。后3字节由厂家自行分配, Mac地址用于在同一网段内通讯内标识身份。因为mac地址没有层次概念,只是一个唯一的标识。
Hub采取的是广播的模式,任何一条消息,其他所有主机都能收到。这就要解决几个问题: 1.这个包是发给谁的?谁应该接收? 2.大家都在发,会不会产生混乱?有没有谁先发、谁后发的规则? 3.如果发送的时候出现了错误,怎么办? MAC的全称是Medium Access Control,即媒体访问控制。来处理这些问题。
1.使用Mac地址来标记,有了这个目标Mac地址,数据包在链路上广播,如果收到消息的设备和目标Mac地址吻合,就接收消息。 2.媒体访问控制,就是控制在往媒体上发数据的时候,谁先发、谁后发的问题。防止发生混乱,称为多路访问。有很多算法可以解决这个问题。如: ①划分不同信道,信道划分; ②轮流来,叫作轮流协议; ③直接发,发现堵等会在发,我们叫作随机接入协议。以太网用的就是这个方式。 3.对于以太网,第二层的最后面是CRC,也就是循环冗余检测。通过 XOR 异或的算法,来计算整个包是否在发送的过程中出现了错误。
交换机: 因为 Hub物理设备, 是广播的,不管某个接口是否需要,所有的 Bit 都会被发送出去,然后让主机来判断是不是需要。所以会导致资源浪费,二层的交换机就会按照某个端的mac地址和这个mac地址是否匹配来做转发,不会发给所有人。 交换机具有学习功能,一开始不知道每个端的mac地址,当某个端发出一个消息后,还是要广播出去,但是由于会带一个src的mac地址,交换机就记住这个端的mac地址(在本地维护一张转发表),等下次有消息dst到这个mac地址的时候,交换机就只会转发到这个端口。
ARP 协议 一个广播的网络里面接入了 N 台机器,我怎么知道每个 MAC 地址是谁呢?这就是ARP 协议,也就是已知 IP 地址,求 MAC 地址的协议。 已知 IP 地址,求 MAC 地址的协议。向广播地址发送arp包,dst的mac地址为空,如果有人收到ip和自己一致,就回复这个消息到src的mac地址和ip,并且带上自己的mac地址。 为了避免每次都用 ARP 请求,机器本地也会进行 ARP 缓存。当然机器会不断地上线下线,IP 也可能会变,所以 ARP 的 MAC 地址缓存过一段时间就会过期。
wireshark抓包 广播询问: 响应:
网络层 Mac地址解决了同网段的通讯,但是如果跨越网段如何通讯呢。
如果是同一个网段,那就没网关什么事情,直接将源地址和目标地址放入 IP 头中,然后通过 ARP 获得 MAC 地址,将源 MAC 和目的 MAC 放入 MAC 头中,发出去就可以了。
如果不是同一网段,这就需要发往默认网关 Gateway。Gateway 的地址一定是和源 IP 地址是一个网段的。往往是主机号是第一个或者第二个。 网关一般是一个路由器,三层的网络设备。它会把 MAC 头和 IP 头都取下来,然后根据IP地址,看看接下来把包转发到哪里。 网关会查看自己的路由表,路由表对应的是下一跳的IP,然后网关将下一跳的IP转化为Mac地址,替换源Mac和目标Mac后,发送。 网关转发的时候,会改变来源Mac地址和目标Mac地址,目标Mac地址就是路由表对应的下一跳的地址。但是不会改变来源IP和目标IP。
改变IP地址的网关我们称为NAT网关,因为我们要和外网通讯,如果私有的内网IP要替换成一个公网唯一的IP。 NAPT会把IP 地址 + 端口号一起进行转换。来避免如果两个私网同时使用相同端口通讯的话。无法标记私网地址的问题。 两个私有 IP 地址都转换 IP 地址为公有地址 120.229.175.121,但是以不同的端口号作为区分。于是,生成一个 NAPT 路由器的转换表,就可以正确地转换地址跟端口的组合,令客户端 A、B 能同时与服务器之间进行通信。
网关的转发规则分为静态路由和动态路由,由系统管理员事先设置好固定路由转发表称之为静态路由表,根据路由协议算法生成动态路由表,随网络运行状况的变化而变化。称为动态路由表。
传输层:
传输层里比较重要的两个协议,一个是 TCP,一个是 UDP。最常用的就是这两个协议。 TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。 TCP 是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。
UDP 和 TCP 有什么区别呢?分别的应用场景是:
UDP 不提供复杂的控制机制,非常简单,头部只有 8 个字节( 64 位),UDP 的头部格式如下:
TCP 和 UDP 区别:
由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:
由于 UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:
端口号: 端口号用来标识本机应用进程。
参考数据:
OSI标准: ISO(国际标准化组织。) 制定了一个国际标准OSI(Open Systems Interconnection开放式通信系统互联参考模型) ,对通信系统进行了标准化。现在,OSI所定义的协议虽然并没有得到普及,但是在OSI协议设计之初作为其指导方针的OSI参考模型却常被用于网络协议的制定当中。
TCP/IP协议: TCP/IP并非ISO所制定的某种国际标准。而是由IETF(Internet Engineering Task Force) 所建议的、致力于推进其标准化作业的一种协议。 TCP/IP协议最终流行的原因是在他标准化过程中,具有两大特点: 一是具有开放性,IETF本身就是一个允许任何人加入进行讨论的组织。每个人都可以参与进来。 二是注重实用性,在制定协议的时候,首要任务是实现真正能够实现通信的技术。
协议 协议就是计算机与计算机之间通过网络实现通信时事先达成的一种“约定”。这种“约定”使那些由不同厂商的设备、不同的CPU 以及不同的操作系统组成的计算机之间,只要遵循相同的协议就能够实现通信。
网络为什么要分层? 复杂的程序都要分层,这是程序设计的要求。各层相互独立,模块化,降低了整个模型的耦合度。每个层都可以独立扩展。