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)——协议介绍相关推荐

  1. linux 工业 网络协议,简单了解Linux TCP/IP协议栈

    什么是TCP/IP协议? TCP/IP是互联网相关各类协议族的总称.计算机与网络设备之间如果要相互通信,双方就必须基于相同的方法.比如,如何探测到通信目标.由哪一边先发起通信.使用哪种语言进行通信.怎 ...

  2. linux内核vrrp配置,在Linux下的(VRRP)虚拟路由冗余协议介绍(转)

    在Linux下的(VRRP)虚拟路由冗余协议介绍(转)[@more@] 这篇文章描述的是如何在Linux下实现VRRP (Virtual Router Redundancy Protocol 虚拟路由 ...

  3. linux内核协议栈 邻居协议之 arp 数据包收发处理流程

    目录 前言 1 arp数据包文接收 arp_rcv() 1.1 处理arp请求 arp_process()[核心] 2 arp数据包发送 arp_send() 2.1 arp 数据包构造 arp_cr ...

  4. Linux远程管理协议相关知识介绍

    一.什么是远程管理 远程管理,实际上就是计算机(服务器)之间通过网络进行数据传输(信息交换)的过程,与浏览器需要 HTTP 协议(超文本传输协议)浏览网页一样,远程管理同样需要远程管理协议的底层支持. ...

  5. 【转载】传统蓝牙协议栈 串口协议SPP

    零. 概述 主要介绍下蓝牙协议栈(bluetooth stack) 串口协议(bluetooth SPP)Serial Port Profile 协议概念介绍. 一. 声明 本专栏文章我们会以连载的方 ...

  6. EtherCAT协议介绍

    EtherCAT协议介绍 前言 EtherCAT(Ethernet for Control Automation Technology)是一种基于以太网的开发构架的实时工业现场总线通讯协议,它于200 ...

  7. linux协议栈skb操作函数,linux协议栈skb操作函数

    1,struct sk_buff数据结构 struct sk_buff{ //这两个结构必须放在最前面 struct sk_buff *next; struct sk_buff *prev; stru ...

  8. 《探寻linux协议栈》之二:源于skb的一场大联欢

    写在前面 skb是什么 skb长什么样 skb中和网络协议有关的指针 skb的储存 skb如何到linux内核协议栈中 内核接收驱动skb的入口函数netif_receive_skb 总结 写在前面 ...

  9. linux 协议栈之socket,Linux TCP/IP 协议栈之 Socket 的实现分析(一)

    内核版本:2.6.37 参考[作者:kendo的文章(基于内涵版本2.6.12)] 第一部份 Socket套接字的创建 socket 并不是 TCP/IP协议的一部份. 从广义上来讲,socket 是 ...

最新文章

  1. 【并发编程】Future模式及JDK中的实现
  2. 实现MySQL高可用群集配置_配置高可用性的MySQL服务器负载均衡群集
  3. 论DATASNAP远程方法支持自定义对象作参数
  4. Linux基本目录解释
  5. Stream操作Collection集合
  6. Golang list双向链表源码走读
  7. 谷歌浏览器安卓_冷知识!你知道安卓系统开始收费了吗?
  8. 一个自己实现的简单的智能指针模板类
  9. Kotlin入门教程——目录索引
  10. 单片机项目开发一般步骤
  11. 电脑开机出现英文“ERROR:System fan has failed”的错误提示
  12. ES的curl常用命令
  13. 一个app管理平台-app-host的搭建
  14. 智能插座常用的两种通信协议——WIFI和ZigBee
  15. 国家地表水水质自动监测站坐标每四小时数据(共1952个监测站,含省份、城市、河流、流域、断面名称、监测时间、水温、pH、DO、CODMn、TP、TN、NH3-N、浊度等)
  16. 离散数学 —— 代数系统(二元运算、封闭性、结合律、幺元、零元、逆元、半群、独异点、群、子群、循环群、置换群、陪集)
  17. filter 无效不起作用
  18. 计算机图形学实验体会,计算机图形学实验报告.doc
  19. Mindspore | lenet 模型代码
  20. 硬盘问题导致无法开机

热门文章

  1. 牛客网数据开发题库_牛客网刷题笔记--数据库
  2. Web开发之-CS架构与BS架构
  3. mysql的binlog开启方式,查看方式.三种binlog模式介绍.以及使用binlog恢复数据.删除binlog
  4. MYSQL给表或者字段写注释
  5. java集合举例_菜鸟程序员都能听得懂得Java集合介绍,快来收藏
  6. python怎么读数据_Python如何读取数据
  7. mysql被替换的文件如何恢复吗_文件被覆盖替换了怎么找回来
  8. 看一看:不同Web前端框架的优缺点分别是什么?
  9. 链路聚合技术及其配置
  10. mipi屏参参数配置