网络基础知识
如果有两台电脑,用网线连接就能通信,但如果电脑一多就不能两两相连了成本高操作也麻烦,可以把每台电脑的线拧在一起这个就叫集线器。
但是集线器只是简单的把线整合,所以每次发的信息都会发送给所有人,而且多台计算机之间发消息的时候会互相干扰,数据就会紊乱,这时候就需要一台交换机。交换机有多个接口,它跟集线器一样每个接口都能接一个设备,但交换机能控制信息流向,原因就是他掌握了所有设备的 mac 地址,有一个 mac 地址表。每台接入交换机的设备都有自己的 mac 地址, mac 地址就是理论上全球唯一的 uuid 。可以理解是设备的身份证号,独一无二的。
交换机原理是什么呢? 比如从一接口发信息到三接口,虽然被交换机连接的设备每个发出的报文中都会附加上发送者和接收者的 mac 地址,但是交换机如果也是第一次拿报文从接口一流入交换机的时候,他会介入一接口设备的 mac 地址,但他不知道接收者mac 地址在几号口,所以他就想我全发一遍就把报文发给所有人了,这种不负责的行为就叫泛洪。还好其他设备懂隐私接收到报文发现mac地址不匹配,这不是给我的呀,非礼勿视就把报文丢弃不处理了。但三接口发现mac地址匹配,一看唉这不给我的吗,就会立马回应,回应的时候也会写上自己作为发送者和一号接收者的mac地址。这时候交换机已经接入了一号和三号各自的 mac 地址了,信息就不需要再泛洪了,直接投递。这就是 mac 地址从发现到通信的全过程。
那 ip 地址是什么? 所谓 mac 地址是跟设备绑定,你要是电脑换成网卡什么的, mac 地址就变了。而 ip 地址类似于你的姓名,可以重名,所以手动管理或者 dscp(Differentiated Services Code Point 一种用于网络流量分类和管理服务质量(QoS)的机制) 动态管理,都能让这台设备通过 ip 地址规划进自己的网络里而。且很多时候你可能不知道设备的 mac 地址,你就需要通过 ip 地址来拿到设备的 mac 地址,比如同样的一口想发信息给二口,报文中附带的发送者和接收者的 ip 地址,由于报文要经过交换机,所以两个人的 mac 地址也要带上。但是尴尬的就是,一口只知道自己的 mac 地址,不知道二口的,那就把他的 map 地址先空着。同样通过泛洪把消息发给了所有人,二口通过 ip 地址匹配发现是给自己的,他回应一口,报文中也附带了自己的 mac 地址。在一来一回的沟通交流中,交换机就掌握了所有设备的 mac 地址。这个由 ip 地址址获取了对方 map 地址的过程就是 arp 协议。
计算机的 mac 地址和 ip 地址绑定的数据表叫arp记录表。如果设备过多,一个交换机不够用,可不可以把很多交换机互相连接,交换机会把每一个经过的 mac 地址都保存起来,设备太多,交换机的 mac 地址表肯定容纳不了。而且交换机特性就是泛洪。它如果全网泛洪,报文处理速度肯定是特别低,这个时候就需要分隔网段了。每一个交换机只用来传输同一网段信息,比如 ip 是192.168.1.1,子网掩码是255.25.255.0,那子网 id 就是192.168.1.0,可用 ip 范围是192.168.11到254。ip 在192.168.1.1到254中就属于一个子网。
如果192.168.2.1的IP想发信息给其他子网,而它不属于这个网段,它的信息就会被路由器帮忙转发,比如你要给我发信息,通过子网掩码得知我不属于你的网段。于是信息本该从计算机到交换机再到计算机,变成了计算机到交换机到路由器去了。
但在设备过多的网络中,路由器同样也是多个。那交换机怎么知道信息该给哪个路由器呢。因为你的电脑网关配置会配上路由器的 ip, 网关就是各个子网的关卡和出口。非内网的信息都会通过这个网关出去,类似就是这个车不是我们村的,那它只能通过村口出去了,村口早已经设定好了。
那第一个路由器又怎么知道给哪个路由器呢?路由器上有个路由表,上面有网段和下一跳,路由器会通过最长前缀匹配选择路由条目。各网段的信息下一步应该交给哪个路由器都一清二楚。这就类似你是老师,你让谁挨着谁坐都可以。路由器是通过接力的方式把信息转给了我的设备。但是路由表是手动配置,设备一多人工维护太费劲。所以就有了我们常说的 ospf(Open Shortest Path First 一种基于链路状态的内部网关协议,使用Dijkstra算法来计算最短路径)。
ospf 可以自动互相学习,自动管理路由表,不需要靠人工去维护。但是如果设备更多、规划更大,那就需要 bgp(Border Gateway Protocol,边界网关协议) 。有了这些协议帮助,就不用费尽心思关心这些复杂的网络环境。计算机通信甚至都回到了一开始说的那样靠一根网线就能通信。
ip 协议能把信息投递到目标计算机,但是计算机应用这么多,你知道投给哪个应用?靠端口。不同的应用使用不同的端口,发送报文时除了附带前面的 mac 地址、 ip 地址外,还要加上源端口和目的端口。这个时候就知道发给哪个应用了。这个带端口的协议就叫 udp 协议。 但是我们日常发送的信息大多都会在中途丢失,所以我们设置了重试机制。如果你发给我失败了,就会重新发送,接收到后我必须还要回应你,以保证数据准确到达。而且大段信息发送很可能造成小部分丢失,这样全部内容都要重发,乱的不行啊。
那这个时候就需要把数据配上序号分成多个包发送,如果信息发送失败只需要重新发送丢失的那部分,又快又准确。不管是发送方的丢失就重传机制,还是接收方接收信息必须应答机制,还是数据整理机制,都需要双方分配计算机资源来处理这些看似繁琐的事。为了提高效率需要双方约定一起开启一起结束,这个约定好的开启和结束就叫做计算机的连接、建立、关闭。
tcp 建立连接时,发送方先传达一个连接意愿,接收方收到后需要响应,如果没响应发送方很可能一直发、不停发、不断发,接收方除了响应还要表达连接意愿,接收方回复后,发送方还要进行最后回应,保证信息的到达。这时候双方就可以开始分配计算资源了,这就是 tcp 协议的三次握手。
连接建立后就能进行数据传输,数据传输完成后两方还要进行一起释放资源,断开连接。发送方发起断开意愿,接收方响应完,还要表达断开意愿,这时候接收方的两条回应就不能看出一条了,发送方响应完信息,这就是四次挥手。
那为什么三次握手,接收方可以合并为一条信息,四次挥手却不能?因为接收方需要等待数据接收完整后才能向发送方表达断开意愿。 udp 和 tcp 是应用层协议的根基,所有应用层协议都是在他们的基础上建立的。