计算机网络基础
进程之间如果需要通信,有以下俩种情况:
- 同一个设备下的进程通信
- 不同设备下的进程通信
第一种情况下,可采用的方法很多,如共享内存,管道,消息队列,信号等等。
而在第二种情况下,我们就要借助计算机网络了。
现在我们知道两个进程之间要通信,但是两个进程所在的设备不同,这就像人要和猫沟通,怎么办?
这个时候我们就要规定沟通的方式了,我们所规定的沟通方式就是计算机网络里的协议。
实践中计算机系统是十分复杂的,为了更好地区分各个模块的功能和作用,我们就进行了分层。
OSI模型有7层,TCP/IP模型有4层。我们现在讨论TCP/IP模型。
TCP/IP模型
应用层
我们最先能接触到的就是应用层。我们平时在计算机上使用的应用都是运行在应用层上的。
比如俩个人通过微信进行聊天,俩个人的微信分别运行在它们各自的手机上,处于不同的设备,必须通过计算机网络进行交流。
微信就是一个应用。
现在,一个人向另外一个人发送信息,计算机要怎么做呢?
计算机会在应用层把数据打包,然后传给模型中的下一层,即传输层。
你会发现,应用层好像没干什么事。
确实,因为应用层的应用只专注于提供应用服务。
应用层不关心数据如何传输。
应用层的协议根据应用的不同有很多,如HTTP,SMTP,FTP,DNS,Telnet等。
应用层运行在操作系统的用户态,传输层及其以下运行在操作系统的内核态。
传输层
传输层服务于应用层。
专注于为应用层传输数据,提供数据支持。
传输层的协议主要有两个
- TCP协议
- UDP协议
TCP协议非常稳定,是面向连接的,可靠的。
面向连接的意思是TCP协议要求先建立两个进程之间的链接。
可靠的意思是TCP协议会严格保证数据可靠,完整。
UDP协议它不如TCP稳定,它只负责把数据包发出去,其他概不负责。
所以UDP协议下数据不可靠,但是效率非常高,实时性强
所以传输层两个协议的应用场景不同
应用层传输的数据有可能很大,这时候TCP会进行分段,TCP最大的报文段长度为MSS。
但是UDP不会分段。
当设备作为接收方时,传输层负责把数据传给应用,可是怎么知道要传给哪一个应用呢?
这个时候需要一个编号,这个编号就是端口。
例如80一般是web服务器用的,22一般是远程登录服务器用的。
浏览器上一般我们会开很多个标签栏,每个标签栏都是独立的进程。操作系统会为它们分配临时的端口号。
由于传输层的报文中会携带端口号,因此接收方可以识别出该报文是发送给哪个应用。
网络层
如果不讲网络层,可能我们会认为是传输层在负责数据的传输,但是不是这样的。
分层的意义就是不让一个层级承担太多的任务
实践中网络是复杂的,不仅仅只有接收方和发送方,还包括诸如网关,路由等等
在这样的网络中传输不应该交给传输层一个人完成。
传输层只要负责服务应用就好了,帮助实现应用和应用的通信。
下面的就让网络层来做吧。网络层将实现实际的传输任务。
传输层最常用协议的就是IP协议。
前面我们说UDP不会分段,那数据太大怎么办?
IP会进行分片。
IP协议会把传输层的报文加上ip头部,组装成ip报文。
如果此时ip报文超过MTU,IP就进行分片。
IP协议最重要的两个功能
- 寻址
- 路由
寻址,字面意思。寻找目标的地址。
网络层中每个设备都有编号,这就是IP地址。
可是在计算机网络中设备那么多,怎么找呢?难道一个一个比对吗?显然不现实。
因此,对于IPV4协议 。IP地址有两层意义
- 网络号,网络号负责找到子网。
- 主机号,主机号负责找到子网中的具体设备。
怎么分的呢?这需要配合子网掩码才能算出 IP 地址 的网络号和主机号。
将IP地址和子网掩码进行按位与运算,就可以得到网络号和主机号。
寻址过程中,先根据网络号找到子网,再寻找具体的主机。
路由功能是针对计算机网络的复杂性提出的。
网络中的双方一般不在一根网线上,途中要经过很多网关、路由器、交换机等众多网络设备。
那么就会形成很多条网络的路径,因此当数据包到达一个网络节点,就需要通过路由算法决定下一步走哪条路径。
路由器寻址工作中,就是要找到目标地址的子网,找到后进而把数据包转发给对应的网络内。
网络接口层
为什么需要网络接口层?
因为在进入广阔的计算机网络之前,数据会先进入以太网。
以太网是什么?
电脑上的以太网接口,Wi-Fi接口,以太网交换机、路由器上的千兆,万兆以太网口,还有网线,它们都是以太网的组成部分。以太网就是一种在「局域网」内,把附近的设备连接起来,使它们之间可以进行通讯的技术。
在以太网中通信要使用MAC地址。
所以网络层传下来的数据要多封装一个MAC头部。
它包含了接收方和发送方的 MAC 地址等信息,我们可以通过 ARP 协议获取对方的 MAC 地址。
所以说,网络接口层主要为网络层提供「链路级别」传输的服务,负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次,使用 MAC 地址来标识网络上的设备。