Linux协议栈(1)——协议介绍

简介:

Linux协议栈(1)——协议介绍

本系列材料是关于Linux网络内核协议栈的,总体上将其分10个文章,主要目的是简明扼要的描述Linux协议栈在内核中的实现,从总体上掌握linux网络协议栈。因为操作系统中的网络子系统非常庞大,加上本系列材料有限,所以路由系统、邻接子系统、无线系统、桥接等不会涉及,后续有机会再系列介绍。

材料先会介绍网络相关相关的TCP/IP协议族知识(本章),然后从总体上观测包的接收和发送流程及代码(第二章和第三章)。(第四章和第五章)介绍网络协议栈相关的数据结构为后续的代码解读打下基础,接着是从最新git代码分支上来走读链路层、网络层、传输层(第六章、第七章和第八章),以及网络驱动(第十章)。最后会介绍Layer5应用层的开发(第十章)以及对本系列的一个总结(第十一章)。

下面我们开始:

       网络协议的正式模型其实是 OSI(Open Systems Interconnection)7层模型,但事实标准是TCP/IP四层模型,linux中的协议模型也是这TCP/IP模型的。这个是历史原因我们不去关注。

其两者模型之间的对应关系如下图所示:

1e0fa5e39f9c24742994996802ba75b80aec7831

       对于某些问题来说,7层模型过于详细,现在完全按照七层来实现的比较少。模型中每层只能与紧邻的层通信。

本系列中基本不涉及应用层(如HTTP(Hyper text transfer protocol)、FTP(file transfer protocol)、SMTP(simple mail transfer rotocol)、POP3(post office protocol 3)、IMAP4(Internet mail access protocol))的具体细节,主要是下面三层的流程、函数和实现。

各层对应的数据如下:

应用层——消息

传输层——数据段(segment)

网络层——分组、数据包(packet)

链路层——帧(frame)

物理层——P-PDU(bit)

当然这个只是称呼,如果非要把每层都叫消息也是可以的,不过这样在交流或者看材料的时候可能会引起误解了。

本章还要先准备一些相关的知识用于后面章节的预热,主要是传输层的协议格式、网络层的协议格式、数据链路层的协议格式。

1.1.1.1  传输层(TCP/UDP)

传输层主要的是TCP和UDP,具有代表性的两个传输层协议。除此之外还有SCTP(Stream Control Transmission Protocol,流控制传输协议),DCCP(数据报拥塞控制协议Datagram Congestion Control Protocol)等传输层协议,当然远没有TCP/UDP两兄弟那么火热。

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

       它的首部如下,注意TCP首部是从20字节~60字节可变的:

e9338c60c17952b0becd87ef659077aa0c4172fa

       如果大家对网络开发比较熟悉的话,这个图应该是比较熟悉的。当然如果不熟悉的话,可以复制下来贴在一个显眼的地方可以让自己能随时看到。

      

而UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。

       UDP的格式如下:

69b51aec571d7a0d350179d9382d92438c8993cf

       他们的格式有个相同点,就是前面4个自己都是记录源端口号和目标端口号的哦。不过在这一层记住并没有IP地址,这是因为在下层网络层的时候会有IP地址的。

       TCP和UDP两个协议各有优缺点,我们先记住一点就好了,TCP是可靠的,UDP是不可靠的。UDP协议时发出包之后就不管了,无法确定对端是否收到了这个包,需要应用程序来判断,而TCP协议在发出包之后是会等待对面发送ACK应答回来的,超时不发送回来说明对面没收到就会触发重传机制。

      

1.1.1.2  网络层(IP)

IP(网际协议,Internet Protocol).

       TCP/IP心脏是互联网层。主要由IP和ICMP两个协议组成。

IP分为三大作用模块:IP寻址、路由、以及IP分包与组包。

       IP包格式如下:

49de75c9c1c78290cf8f4467ee52e938e717ef7e

       这个报头内容也挺多,大家不用一次记住它,可以和TCP/UDP协议头一起打印出来贴起来。

 

1.1.1.3  链路层(以太网帧)

最后我们来看下链路层,链路层协议有以太网、SLIP、令牌网等等,我们这里以当前最常用的以太网为例。

在数据链路层中称这种数据为帧(frame

我们来看下以太网格式,如下图:

6d35b19d0127dfa14fe37e36a8a52b88b6f313a3

       以太网的帧尾是一个叫做FCS(Frame Check Sequence,帧检验序列)的4个字节。用于检查帧是否有所损坏。传输过程中如果出现电子噪声干扰,可能会导致乱码位的出现。

知道这些TCP/IP协议的知识足够我们继续往下走了,至于那些RFC中陈芝麻、烂谷子的事情就不提了。

       后面我们开始看在 Linux 网络协议栈中的接收流程。
目录
相关文章
|
存储 Shell Linux
【Shell 命令集合 磁盘管理 】⭐⭐ Linux 显示当前shell会话中的目录栈 dirs命令使用教程
【Shell 命令集合 磁盘管理 】⭐⭐ Linux 显示当前shell会话中的目录栈 dirs命令使用教程
172 0
|
Shell Linux C语言
【Shell 命令集合 磁盘管理 】Linux 显示当前shell会话中的目录栈 dirs命令使用教程
【Shell 命令集合 磁盘管理 】Linux 显示当前shell会话中的目录栈 dirs命令使用教程
203 1
|
9月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
263 18
|
9月前
|
Linux 网络安全 iOS开发
SecureCRT & SecureFX 9.6.3 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输
SecureCRT & SecureFX 9.6.3 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输
2057 4
SecureCRT & SecureFX 9.6.3 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输
|
存储 网络协议 Ubuntu
【Linux开发实战指南】基于UDP协议的即时聊天室:快速构建登陆、聊天与退出功能
UDP 是一种无连接的、不可靠的传输层协议,位于IP协议之上。它提供了最基本的数据传输服务,不保证数据包的顺序、可靠到达或无重复。与TCP(传输控制协议)相比,UDP具有较低的传输延迟,因为省去了建立连接和确认接收等过程,适用于对实时性要求较高、但能容忍一定数据丢失的场景,如在线视频、语音通话、DNS查询等。 链表 链表是一种动态数据结构,用于存储一系列元素(节点),每个节点包含数据字段和指向下一个节点的引用(指针)。链表分为单向链表、双向链表和循环链表等类型。与数组相比,链表在插入和删除操作上更为高效,因为它不需要移动元素,只需修改节点间的指针即可。但访问链表中的元素不如数组直接,通常需要从
651 2
|
负载均衡 网络协议 Linux
在Linux中,如何理解VRRP协议?
在Linux中,如何理解VRRP协议?
|
安全 算法 网络协议
【在Linux世界中追寻伟大的One Piece】HTTPS协议原理
【在Linux世界中追寻伟大的One Piece】HTTPS协议原理
188 2
|
缓存 网络协议 Linux
扩展Linux网络栈
扩展Linux网络栈
412 3
|
存储 Linux 网络安全
【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)
【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)
227 0