Linux协议栈(1)——协议介绍
Linux协议栈(1)——协议介绍
本系列材料是关于Linux网络内核协议栈的,总体上将其分10个文章,主要目的是简明扼要的描述Linux协议栈在内核中的实现,从总体上掌握linux网络协议栈。因为操作系统中的网络子系统非常庞大,加上本系列材料有限,所以路由系统、邻接子系统、无线系统、桥接等不会涉及,后续有机会再系列介绍。
材料先会介绍网络相关相关的TCP/IP协议族知识(本章),然后从总体上观测包的接收和发送流程及代码(第二章和第三章)。(第四章和第五章)介绍网络协议栈相关的数据结构为后续的代码解读打下基础,接着是从最新git代码分支上来走读链路层、网络层、传输层(第六章、第七章和第八章),以及网络驱动(第十章)。最后会介绍Layer5应用层的开发(第十章)以及对本系列的一个总结(第十一章)。
下面我们开始:
网络协议的正式模型其实是 OSI(Open Systems Interconnection)7层模型,但事实标准是TCP/IP四层模型,linux中的协议模型也是这TCP/IP模型的。这个是历史原因我们不去关注。
其两者模型之间的对应关系如下图所示:
对于某些问题来说,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字节可变的:
如果大家对网络开发比较熟悉的话,这个图应该是比较熟悉的。当然如果不熟悉的话,可以复制下来贴在一个显眼的地方可以让自己能随时看到。
而UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。
UDP的格式如下:
他们的格式有个相同点,就是前面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包格式如下:
这个报头内容也挺多,大家不用一次记住它,可以和TCP/UDP协议头一起打印出来贴起来。
1.1.1.3 链路层(以太网帧)
最后我们来看下链路层,链路层协议有以太网、SLIP、令牌网等等,我们这里以当前最常用的以太网为例。
在数据链路层中称这种数据为帧(frame)
我们来看下以太网格式,如下图:
以太网的帧尾是一个叫做FCS(Frame Check Sequence,帧检验序列)的4个字节。用于检查帧是否有所损坏。传输过程中如果出现电子噪声干扰,可能会导致乱码位的出现。
知道这些TCP/IP协议的知识足够我们继续往下走了,至于那些RFC中陈芝麻、烂谷子的事情就不提了。
后面我们开始看在 Linux 网络协议栈中的接收流程。
Linux协议栈(1)——协议介绍相关推荐
- linux 工业 网络协议,简单了解Linux TCP/IP协议栈
什么是TCP/IP协议? TCP/IP是互联网相关各类协议族的总称.计算机与网络设备之间如果要相互通信,双方就必须基于相同的方法.比如,如何探测到通信目标.由哪一边先发起通信.使用哪种语言进行通信.怎 ...
- linux内核vrrp配置,在Linux下的(VRRP)虚拟路由冗余协议介绍(转)
在Linux下的(VRRP)虚拟路由冗余协议介绍(转)[@more@] 这篇文章描述的是如何在Linux下实现VRRP (Virtual Router Redundancy Protocol 虚拟路由 ...
- linux内核协议栈 邻居协议之 arp 数据包收发处理流程
目录 前言 1 arp数据包文接收 arp_rcv() 1.1 处理arp请求 arp_process()[核心] 2 arp数据包发送 arp_send() 2.1 arp 数据包构造 arp_cr ...
- Linux远程管理协议相关知识介绍
一.什么是远程管理 远程管理,实际上就是计算机(服务器)之间通过网络进行数据传输(信息交换)的过程,与浏览器需要 HTTP 协议(超文本传输协议)浏览网页一样,远程管理同样需要远程管理协议的底层支持. ...
- 【转载】传统蓝牙协议栈 串口协议SPP
零. 概述 主要介绍下蓝牙协议栈(bluetooth stack) 串口协议(bluetooth SPP)Serial Port Profile 协议概念介绍. 一. 声明 本专栏文章我们会以连载的方 ...
- EtherCAT协议介绍
EtherCAT协议介绍 前言 EtherCAT(Ethernet for Control Automation Technology)是一种基于以太网的开发构架的实时工业现场总线通讯协议,它于200 ...
- linux协议栈skb操作函数,linux协议栈skb操作函数
1,struct sk_buff数据结构 struct sk_buff{ //这两个结构必须放在最前面 struct sk_buff *next; struct sk_buff *prev; stru ...
- 《探寻linux协议栈》之二:源于skb的一场大联欢
写在前面 skb是什么 skb长什么样 skb中和网络协议有关的指针 skb的储存 skb如何到linux内核协议栈中 内核接收驱动skb的入口函数netif_receive_skb 总结 写在前面 ...
- linux 协议栈之socket,Linux TCP/IP 协议栈之 Socket 的实现分析(一)
内核版本:2.6.37 参考[作者:kendo的文章(基于内涵版本2.6.12)] 第一部份 Socket套接字的创建 socket 并不是 TCP/IP协议的一部份. 从广义上来讲,socket 是 ...
最新文章
- 【并发编程】Future模式及JDK中的实现
- 实现MySQL高可用群集配置_配置高可用性的MySQL服务器负载均衡群集
- 论DATASNAP远程方法支持自定义对象作参数
- Linux基本目录解释
- Stream操作Collection集合
- Golang list双向链表源码走读
- 谷歌浏览器安卓_冷知识!你知道安卓系统开始收费了吗?
- 一个自己实现的简单的智能指针模板类
- Kotlin入门教程——目录索引
- 单片机项目开发一般步骤
- 电脑开机出现英文“ERROR:System fan has failed”的错误提示
- ES的curl常用命令
- 一个app管理平台-app-host的搭建
- 智能插座常用的两种通信协议——WIFI和ZigBee
- 国家地表水水质自动监测站坐标每四小时数据(共1952个监测站,含省份、城市、河流、流域、断面名称、监测时间、水温、pH、DO、CODMn、TP、TN、NH3-N、浊度等)
- 离散数学 —— 代数系统(二元运算、封闭性、结合律、幺元、零元、逆元、半群、独异点、群、子群、循环群、置换群、陪集)
- filter 无效不起作用
- 计算机图形学实验体会,计算机图形学实验报告.doc
- Mindspore | lenet 模型代码
- 硬盘问题导致无法开机
热门文章
- 牛客网数据开发题库_牛客网刷题笔记--数据库
- Web开发之-CS架构与BS架构
- mysql的binlog开启方式,查看方式.三种binlog模式介绍.以及使用binlog恢复数据.删除binlog
- MYSQL给表或者字段写注释
- java集合举例_菜鸟程序员都能听得懂得Java集合介绍,快来收藏
- python怎么读数据_Python如何读取数据
- mysql被替换的文件如何恢复吗_文件被覆盖替换了怎么找回来
- 看一看:不同Web前端框架的优缺点分别是什么?
- 链路聚合技术及其配置
- mipi屏参参数配置