网络协议基础入门

说明

本章节会对网络协议以及数据传输进行一个简单的讲解和说明.

网络分层

以下就是一个简单的场景.Linux服务器A和Linux服务器B处于不同的网段,通过中间的Linux服务器作为路由器进行转发.一个简单的网络传输如下所示:

所有的网络传输过程都对应网络协议模型.目前存在两种网络协议模型,一种是OSI的标准七层模型,一种是业界标准的TCP/IP模型.对应关系如下:

为什么网络需要分层?因为网络环境过于复杂,不是一个能够集中控制的体系.全球数以亿记的服务器和设备各有各的体系,但是都可以通过同一套网络协议栈通过切分成多个层次和组合,来满足不同服务器和设备的通信要求.

  • 第一层,物理层,就是物理设备.
  • 第二层,数据链路层,有时候也称为MAC层.所谓MAC就是每个网卡都有唯一的硬件地址,可以唯一定位到没一台机器.
  • 第三层,网络层.网络层决定数据的路径选择和转寄,将网络表头(NH)加至数据包以形成报文.网络表头包含了网络数据.
  • 第四层,传输层.两个著名的协议TCP和UDP.尤其是TCP, 应用更加广泛.IP层仅仅负责数据从一个IP地址发送到另一个IP地址,而TCP需要对数据的丢包,乱序,重传,拥塞处理.
  • 最后是应用层.比如HTTP服务,DNS服务.

二层到四层都是LInux内核里面处理的,应用层都是在用户态的.Linux内核对于网络包的处理是不区分应用.

应用层和内核是通过Socket系统调用完成的.Socket数据操作系统的概念,不属于网络协议分层的概念.只不过操作系统选择对于网络协议实现模式是,二到四层的处理代码在内核里面,七层的处理代码让应用自己去做,两者需要跨内核态和用户态通信,就需要一个系统调用完成这个反而衔接,这就是Socket.

在TCP/IP协议中, IP地址+TCP或UDP端口号 唯一标识网络通讯中的一个进程。IP地址+端口号 就对应一个socket。

数据包

下图展示的的是一个更加详细的数据发送的例子.

服务器A

浏览器将请求封装为HTTP协议,通过socket协议发送到内核.内核中的网络协议栈里面,在TCP层创建用于维护连接,序列号,重传,拥塞控制的数据结构,将HTTP包加上TCP头,发送给IP层,IP层加上IP头,发送给MAC层,MAC层加上MAC头,从硬件网卡发出.

交换机1

交换机常称为二层设备.因为交换机只会处理到第二层,然后它会将网络包的MAC头拿下来,发现目标MAC是在自己右边的网口,于是就从这个网口发出去.

路由器

路由器称为三层设备,因为它只能处理到第三层.网络包到达路由器之后,路由器发现MAC地址匹配,就交给IP层,在IP层根据IP头中的信息,在路由表中查找.下一跳在哪里,应该从哪个网口发出去.

交换机2

与交换机1的处理方式相同

服务器B

当数据包到达服务器B之后,发现MAC地址匹配,就将MAC头取下来,交给上一层.IP层发现IP地址匹配,将IP头取下来,交给上一层.TCP层会根据TCP头中的序列号等信息,发现他是一个正确的网络包,就会将网络包缓存起来.等待应用层的读取.应用层通过Socket监听某个端口,因而读取的时候,内核会根据TCP头中的端口号,将网络包发给相应的应用.

TCP&UDP

TCP和UDP是两个主流的传输层协议.

  • TCP是面像连接的,UDP是面像无连接的.
  • TCP提供可靠交付,无差错,不丢失,不重复,并且按序到达;UDP不提供可靠交付,不保证不丢失,不保证按顺序到达.
  • TCP是面向字节流的,发送是发的是一个流,没头没尾;UDP是面向数据报的,一个一个发送
  • TCP是可以提供流量控制和拥塞控制的,即防止对断被压垮,也防止网络被压垮.