计算机网络基础

近期迷上了一本书《Netty4核心原理与手写RPC框架实战》,在这本书的第一部分介绍了网络的一些相关知识,非常基础,但是这些知识确实学习Netty框架的重要根基。下面对第一部分的学习进行输出。

网络分层模型

OSI模型

记得当初学习计算机网络课程的时候,首先介绍的就是网络的分层模型,接着从底层往上介绍,每一层介绍其对应的一些协议是怎么样的?有什么作用?特点是什么?OSI参考模型分为七层,自底向上为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

  • 物理层主要是电气设备,比如我们的网线、网卡就是物理层的设备,物理层主要负责比特流的传输;
  • 数据链路层主要是一些交换机设备,提供物理寻址的功能,这一层负责进行比特流与数据帧的转换;
  • 网络层为网络的路由、分组传输提供支撑,常见设备为路由器。
  • 传输层负责数据的传输,通常分为TCP和UDP,我们需要格外关注的都是在这一个层面上。
  • 会话层则是不同机器间的通信会话管理层。
  • 表示层通常做一些加密解密与数据压缩、转换等工作,可以理解为对数据做外观工作。
  • 应用层则是我们接触的最多的一个层面,包括HTTP、FTP、SMTP、POP3等协议。
OSI分层示意图
OSI分层示意图

TCP/IP模型

与OSI参考模型相对的就是TCP/IP分层了,TCP/IP分层自底向上为:网络接口层、网际层、传输层、应用层。即OSI的物理层与数据链路层对应TCP/IP的网络接口层,OSI的网络层对应TCP/IP的网际层,OSI的会话层、表示层、应用层对应TCP/IP的应用层。

TCP/IP分层示意图
TCP/IP分层示意图

网络协议

TCP和UDP

TCP(传输控制协议)是一种面向连接的、可靠的传输协议。TCP报文分由TCP头部和数据部分组成,TCP头部有至少20字节的固定首部,以及可变长度的选项和填充。

TCP报文格式
TCP报文格式

TCP交互过程为:建立连接、传输数据、释放连接。连接管理机制实际上就是对TCP连接的建立和释放过程的管理控制,使其正常运行,并且双方能够知道对方的存在。TCP是如何保证可靠性的呢?TCP提供了校验和、 序列号/确认应答、超时重传、最大消息长度和滑动窗口等方法来实现可靠传输。具体如下:

校验和:将TCP头部、TCP数据加上TCP伪头部进行校验和运算,检查数据是否有差错,如果存在差错,直接丢弃,并要求重传。

序列号/确认应答:TCP的每一个包都会在头部加上序列号,接收端在接收到之后需要对这个数据包进行确认接收。

超时重传:在发送端发送数据包之后一段时间后没有收到接收端发来的确认包(ACK),则将刚刚发送的数据包重新发送,如果多次发送未接收到确认包,则认为接收端异常,强制关闭该连接。在这之前提到了一段时间后,这个时间指的是RTT(往返时间),也就是发送方发送数据包到接收方与接收方发送确认包所花费的时间总和,再加上网络是会产生延时,这种时间上的偏差为抖动,超时等待的时间大约为RTT+抖动值

最大消息长度:这个最大消息长度是建立TCP连接时双方约定的一个发送最大长度(MSS)。重传的数据也是以这个长度来重传的。

滑动窗口:滑动窗口协议解决了超时重传机制效率低的问题,使用缓冲区的方式不断发送数据包而不需要等待确认包再发送下一条数据,每次接收到确认包,都会将这个包从缓冲区移除,这样大大提升了数据的传输效率。当然,滑动窗口只是让发送端不需要等待可以一直发送,但是如果在接收到某个确认包后又连续三次接收到同样的确认包,将会认为确认包后面的数据都传递失败了,将会启动快重传机制,而不需要等待超时时间来触发重传。

拥塞控制:拥塞控制是防止网络拥堵时仍然在不断发送数据包加重网络负担,拥塞控制过程包括:慢启动、加法增大、除法减小。慢启动是指缓慢启动,开始时将窗口设置为1,指数增长,当窗口大小达到初始阈值时,进行加法增大。加法增大是指阈值线性增加,加法增加会一直加到网络拥塞,然后进行除法减小,将初始阈值设置为当前阈值的一半,并重新以慢启动开始。

UDP(用户数据报协议)是一种无连接的、不可靠的传输协议,UDP的长度只有65535字节大小,其中UDP头部占据8个字节,包括:源端口、目标端口、头部长度、校验和。校验和需要在UDP包前面加上12个字节的伪首部,然后进行二进制反码运算求和再求和再取反。UDP报文格式如下图所示,UDP伪首部是不会传给下层的,仅仅作为校验和使用。

UDP报文格式
UDP报文格式

IP协议

IP协议作为网络层协议,目前有IPv4和IPv6,两者具体区别如下:

  • IPv4长度为32位,IPv6长度为128位。
  • IPv4每个段的范围为[0, 255],IPv6每个段的范围是[0, 0xFFFF]。
  • IPv4以点作段的分隔,IPv6以:作段的分隔。
  • IPv6的每个段的前导0可以省略,如08ff可以写成8ff。
  • IPv6全0段可以用::表示,但只能有一个,如08ff:0:0:0:1:0只能为8ff::1:0

计算机网路中的协议都是由协议头和数据部分组成的,IP协议也是一样,它的协议头部有版本号、首部长度、服务类型、总长度、标识、标志位、片偏移、生存时间、协议、首部校验和。IPv4的首部长度标识IP头部的长度大小,占4个比特位,首部长度是以4个字节为单位,因此IP头部最长为60字节,最小为20个字节,但是IPv6的首部长度是固定40个字节。IP报文的总长度,占16位,因此最长能装下65535个字节长度的数据,对于超出长度的数据将会进行分片传输。IP协议报文如下图所示:

IP报文格式
IP报文格式

自顶向下数据封装时,以HTTP为例,HTTP会封装一个HTTP头部和HTTP数据部分作为报文,接着在传输层将HTTP报文放入TCP数据部分,组装上TCP头部变成数据包。数据包将会交给网络层的IP协议进行封装,IP协议将TCP数据包放入IP数据部分,加上IP协议头就组成了数据帧,超过IP协议的长度将会被拆分为多个IP报文,每一个报文都包含了IP头部。接着到链路层时,会加上以太网协议,然后交给物理层进行二进制转换和传输,以太网协议的数据体不能超过1500字节,超出的同样会进行分段传输,最终的数据报文包含了每一层的协议头和数据上一层的报文均放置在下一层的报文的数据部分,如下图所示。

报文封装
报文封装

总结

在学校学习计算机网络的时候没有这么多细节,而且重点都放在了路由协议和路由命令的介绍,还有IP、子网掩码、无类域间路由、路由汇总、子网划分等内容上,因此在看这本书后,从网上找了许多资料,写下了自己对这些协议的认识,补充自己的计算机网络知识。

整篇文章下来发现,自己的博客好像不是那么的有趣,希望接下来能够找到一种有趣的方式来分享自己的知识,如果你有好的建议或者觉得哪里说的不正确,添加我的QQ:473074764,我们一起讨论、学习,一起进步!