第一层—物理层
集线器:解决多个设备网线过多
但集线器收到信号只能转发给所有设备,不能选择性转发。
MAC地址:所有连接到集线器的设备的全局唯一的名字。 用于帮助集线器的选择性转发。它是由网络设备制造商生产时烧录在网卡的EPROM(一种闪存芯片,通常可以通过程序擦写)。其中前 24 位(00-16-EA)代表网络硬件制造商的编号,后 24 位(AE-3C-40)是该厂家自己分配的,一般表示系列号。MAC地址不可修改
集线器还是会将数据发给所有设备,但是设备看到不是发给自己的,就会丢弃数据。
但是这样依然还是会发给所有设备,存在安全问题,能不能就只发给一个设备呢?
第二层—数据链路层
交换机:交换机内部维护一张 MAC 地址表,记录着每一个 MAC 地址的设备,连接在其哪一个端口上。
你给这个通过这样传输方式而组成的小范围的网络,叫做以太网。
随着机器数量越多,交换机的端口也不够了,但聪明的你发现,只要将多个交换机连接起来,这个问题就轻而易举搞定~
但如果电脑的数量再多,那么交换机也无法承受了。
第三层—网络层
路由器:用于取代大量的交换机。路由器的每一个端口,都有独立的 MAC 地址
那么若在不在同一以太网下,则要不要发给路由器,是怎么判断的呢?
IP地址:给每一台机器一个 32 位的编号,如:
11000000101010000000000000000001
你觉得有些不清晰,于是把它分成四个部分,中间用点相连。
11000000.10101000.00000000.00000001
你还觉得不清晰,于是把它转换成 10 进制。
192.168.0.1
IP地址无法更改
子网掩码:为了能让计算机懂得如何判断子网而诞生
子网:将源 IP 与目的 IP 分别同这个子网掩码进行与运算,相等则是在一个子网,不相等就是在不同子网,就这么简单。
如果在同一个子网,则通过数据链路层进行传输数据。
如果不在一个子网,则把数据包转发给路由器,通过网络层进行传输。
在传输数据时,我们只能知道ip地址,不知道MAC地址,那么如何在同一子网下传输呢?
arp 协议:每个电脑里面会有一张 arp 缓存表,表中记录着 IP 与 MAC 地址的对应关系。
默认网关:A 只能直接把包发给同处于一个子网下的某个 IP 上,所以发给路由器还是发给某个电脑,对 A 来说也不关心,只要这个设备有个 IP 地址就行。所以默认网关,就是 A 在自己电脑里配置的一个 IP 地址,以便在发给不同子网的机器时,发给这个 IP 地址。
发送到路由器需要获得路由器的MAC
直接通过交换机传输几节课
数据链路层的任何传输都需要经过交换机,而经过交换机就必须要MAC地址,所以数据链路层的任何传输都需要AMC地址。
路由器之间的传输是通过数据链路层上的,源MAC和目标MAC都需要变化为路由器1的MAC和路由器2的MAC。
第四层—传输层
前三层只能实现主机与主机之间的传输,但是传输给主机之后,不知道要将数据交给哪个进程?
于是在数据包中增加了传输层的头部,其中包括源端口和目标端口, 这也就达成了UDP 协议!
然而,在数据传输过程中还是会出现很多问题。
丢包、效率、顺序问题
由于网络的不可靠,数据包可能在半路丢失,而 A 和 B 却无法察觉
A 在发送的数据包中增加一个序号(seq),同时 B 要在 ACK 包上增加一个确认号(ack),这样不但解决了停止等待协议的效率问题,也通过这样标序号的方式解决了顺序问题。
流量问题
有的时候,A 发送数据包的速度太快,而 B 的接收能力不够。
解决办法:动态滑动窗口
每次发送数据包给 A 时,顺带传过来一个值,叫窗口大小(win),这个值就表示 B 的接收能力。同理,每次 A 给 B 发包时也带上自己的窗口大小,表示 A 的接收能力。
拥塞问题
拥塞控制与流量控制有些像,但流量控制是受 B 的接收能力影响,而拥塞控制是受网络环境的影响。
解决方式:动态滑动窗口
A 单方面通过试探,不断感知网络环境的好坏,进而确定自己的拥塞窗口的大小。
假如拥塞窗口的大小为 cwnd,上一部分流量控制的滑动窗口的大小为 rwnd,那么窗口的右边界受这两个值共同的影响,需要取它俩的最小值。
窗口大小 = min(cwnd, rwnd)
连接问题
有的时候,B 主机的相应进程还没有准备好或是挂掉了,A 就开始发送数据包,导致了浪费。
解决方式:三次握手
A:我准备好了(SYN)
B:我知道了(ACK),我也准备好了(SYN)
A:我知道了(ACK)
有了建立连接的过程,就要考虑释放连接的过程。
解决方式:四次挥手
A:再见,我要关闭了(FIN)
B:我知道了(ACK)
给 B 一段时间把自己的事情处理完...
B:再见,我要关闭了(FIN)
A:我知道了(ACK)
TCP
TCP 是
面向连接的、可靠的、基于字节流的
传输层通信协议
什么是基于字节流?
TCP 在建立连接时,需要告诉对方 MSS(最大报文段大小)。
也就是说,如果要发送的数据很大,在 TCP 层是需要按照 MSS 来把数据切割成一个个的 TCP 报文段 的。
切割时只会把数据当作一个个字节来进行切割,不会考虑别的问题。这也就是基于字节流的含义。