Linux 网络协议栈_linux网络协议栈
off999 2025-09-19 01:10 76 浏览 0 评论
前言;
更多学习资料(包含视频、技术学习路线图谱、文档等)后台私信《资料》免费领取
技术点包含了C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等方面。
TCP与UDP区别
区别一、是否基于连接
TCP是面向连接的协议,而UDP是无连接的协议。即TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接。
区别二、可靠性 和 有序性 区别
TCP 提供交付保证(Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输),无差错,不丢失,不重复,且按序到达,也保证了消息的有序性。该消息将以从服务器端发出的同样的顺序发送到客户端,尽管这些消息到网络的另一端时可能是无序的。TCP协议将会为你排好序。
UDP不提供任何有序性或序列性的保证。UDP尽最大努力交付,数据包将以任何可能的顺序到达。
TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
区别三、实时性
UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
区别四、协议首部大小
TCP首部开销20字节; UDP的首部开销小,只有8个字节 。
区别五、运行速度
TCP速度比较慢,而UDP速度比较快,因为TCP必须创建连接,以保证消息的可靠交付和有序性,毕竟TCP协议比UDP复杂。
区别六、拥塞机制
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
区别七、流模式(TCP)与数据报模式(UDP);
TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;
UDP是面向报文的 。
区别八、资源占用
TCP对系统资源要求较多,UDP对系统资源要求较少。
TCP被认为是重量级的协议,而与之相比,UDP协议则是一个轻量级的协议。因为UDP传输的信息中不承担任何间接创造连接,保证交货或秩序的的信息。这也反映在用于承载元数据的头的大小。
区别九、应用
每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信 。基于UDP不需要建立连接,所以且适合多播的环境,UDP是大量使用在游戏和娱乐场所。
TCP UDP 的区别和具体应用场景
TCP和UDP
两者都是通信协议,TCP和UDP都是传输层协议,但是他们的通信机制和应用场景不同。
TCP
TCP(Transmission Control Protocol)又叫传输控制协议,TCP是面向连接的,并且是一种可靠的协议,在基于TCP进行通信时,通信双方需要建立TCP连接,建立连接需要经过三次握手,握手成功才可以通信。
UDP
UDP是一种面向无连接,切不可靠的协议,在通信过程中,它并不像TCP那样需要先建立一个连接,只要目的地址,端口号,源地址,端口号确定了,就可以直接发送信息报文,并且不需要一定能收到或者完整的数据。它仅仅提供了校验和机制来保障报文是否完整,若校验失败,则直接将报文丢弃,不做任何处理。
TCP,UDP的优缺点
TCP优点
可靠,稳定
TCP的可靠性体现在传输数据之前,三次握手建立连接(四次挥手断开连接),并且在数据传递时,有确认,窗口,重传,拥塞控制机制,数据传完之后断开连接来节省系统资源。
TCP缺点
慢,效率比较低,占用系统资源,容易被攻击
传输数据之前建立连接,这样会消耗时间,而且在消息传递时,确认机制,重传机制和拥塞机制都会消耗大量的时间,而且要在每台设备上维护所有的传输连接。而且每一个连接都会占用系统的CPU,内存等硬件软件资源。并且TCP的取而机制,三次握手机制导致TCP容易被人利用,实现DOS,DDOS攻击。
UDP优点
快,比TCP安全
UDP没有TCP的握手,确认窗口,重传,拥塞机制。UDP是一个无状态的传输机制,所以在传输数据时非常快。UDP没有TCP这些机制,相应被利用的漏洞就少一点。但是UDP的攻击也是存在的,比如:UDP 的flood攻击。
UDP缺点
不可靠,不稳定
因为UDP没有TCP的那些可靠机制,在网络质量不好的时候容易发生丢包。
应用场景
TCP应用场景
当对网络通信质量有要求时,比如:整个数据要准确无误的传递给对方,这往往对于一些要求可靠的应用,比如HTTP,HTTPS,FTP等传输文件的协议,POP,SMTP等邮件的传输协议。常见使用TCP协议的应用:
1.浏览器使用的:HTTP
2.FlashFXP:FTP
3.Outlook:POP,SMTP
4.QQ文件传输
UDP 应用场景
对当前网络通讯质量要求不高的时候,要求网络通讯速度尽量的快,这时就使用UDP
日常生活中常见使用UDP协议:
1.QQ语音
2.QQ视频
3.TFTP
内核常见文件
网络信息传输过程
发送端
应用层
socket
Linux系统中,socket 属于文件系统的一部分,网络通信可以被看作是对文件的读取,使得我们对网络的控制和对文件的控制一样方便。
UDP的socket处理过程:
TCP的socket处理过程:
应用层处理流程
网络应用调用Socket API socket (int family, int type, int protocol) 创建一个 socket,该调用最终会调用 Linux system call socket() ,并最终调用 Linux Kernel 的 sock_create() 方法。
该方法返回被创建好了的那个 socket 的 file descriptor。
对于每一个 userspace 网络应用创建的 socket,在内核中都有一个对应的 struct socket和 struct sock。其中,struct sock 有三个队列(queue),分别是 rx (接受), tx(发送) 和 err(错误),在 sock 结构被初始化的时候,这些缓冲队列也被初始化完成;在收据收发过程中,每个人 queue 保存要发送或者接受的每个 packet对应的 Linux 网络栈 sk_buffer 数据结构的实例 skb。(sk_buff(socket buffer)结构是linux网络代码中重要的数据结构,它管理和控制接收或发送数据包的信息。)
对于 TCP socket 来说,应用调用 connect()API ,使得客户端和服务器端通过该 socket 建立一个虚拟连接器。在此过程中,TCP 协议栈通过三次握手会建立 TCP 连接。默认的,该 API 会等到 TCP 握手完成连接建立后才返回。在建立连接的过程中的一个重要步骤是,确定双方使用的 Maxium Segemet Size (MSS)。
因为 UDP 是面向无连接的协议,因此它是不需要该步骤的。
应用调用 Linux Socket 的 send 或者 write API 开发出一个 message 给接收端
sock_sendmsg 被调用,它使用 socket descriptor 获取 sock struct,创建 message header 和 socket control message
_sock_sendmsg 被调用,根据 socket 的协议类型,调用相应协议的发送函数。
对于 TCP ,调用 tcp_sendmsg() 函数。
对于 UDP 来说,userspace 应用可以调用 send()/sendto()/sendmsg() 三个 system call 中的任意一个人来发送 UDP message,它们最终都会调用内核中的 udp_sendmsg() 函数。
传输层
传输层的最终目的是向它的用户提供高效的、可靠的和成本有效的数据传输服务,主要功能包括 :
(1)构造 TCP segment
(2)计算 checksum
(3)发送回复(ACK)包
(4)滑动窗口(sliding windown)等保证可靠性的操作。
TCP 协议栈的大致处理过程如下图所示:
TCP 栈简要过程:
tcp_sendmsg 函数会首先检查已经建立的 TCP connection 的状态,然后获取该连接的 MSS,开始 segement 发送流程。
构造 TCP 段的 playload:它在内核空间中创建该系统 packet 的 sk_buffer 数据结构的实例 skb,从 userspace buffer 中拷贝 packet 的数据到 skb 的 buffer。
构造 TCP header。
计算 TCP 校验和(checksum)和 顺序号 (sequence number)。
TCP 校验和是一个端到端的校验和,由发送端计算,然后由接收端验证。其目的是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到校验和有差错,则TCP段会被直接丢弃。TCP校验和覆盖 TCP 首部和 TCP 数据。
发到 IP 层处理:调用 IP handler 句柄 ip_queue_xmit,将 skb 传入 IP 处理流程。
UDP 栈简要过程
UDP 将 message 封装成 UDP 数据报
调用 ip_append_data() 方法将 packet 送到 IP 层进行处理。
IP 网络层 - 添加header 和 checksum,路由处理,IP fragmentation
网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息- -源站点和目的站点地址的网络地址。
其主要任务包括
(1)路由处理,即选择下一跳
(2)添加 IP header
(3)计算 IP header checksum,用于检测 IP 报文头部在传播过程中是否出错
(4)可能的话,进行 IP 分片
(5)处理完毕,获取下一跳的 MAC 地址,设置链路层报文头,然后转入链路层处理。
接收端
传输层 (TCP/UDP)
传输层 TCP 处理入口在 tcp_v4_rcv 函数(位于 linux/net/ipv4/tcp ipv4.c 文件中),它会做 TCP header 检查等处理。
调用 _tcp_v4_lookup,查找该 package 的 open socket。如果找不到,该 package 会被丢弃。
接下来检查 socket 和 connection 的状态。
如果socket 和 connection 一切正常,调用 tcp_prequeue 使 package 从内核进入 user space,放进 socket 的 receive queue。然后 socket 会被唤醒,调用 system call,并最终调用 tcp_recvmsg 函数去从 socket recieve queue 中获取 segment。
接收端 - 应用层每当用户应用调用 read 或者 recvfrom 时,该调用会被映射为/net/socket.c 中的 sys_recv 系统调用,并被转化为 sys_recvfrom 调用,然后调用 sock_recgmsg 函数。
对于 INET 类型的 socket,/net/ipv4/af inet.c 中的 inet_recvmsg 方法会被调用,它会调用相关协议的数据接收方法。
对 TCP 来说,调用 tcp_recvmsg。该函数从 socket buffer 中拷贝数据到 user buffer。
对 UDP 来说,从 user space 中可以调用三个 system call recv()/recvfrom()/recvmsg() 中的任意一个来接收 UDP package,这些系统调用最终都会调用内核中的 udp_recvmsg 方法。
sk_buff 是什么(详解)
sk_buff 是 Linux 网络的一个核心数据结构,其定义文件在 skbuffer.h。
socket kernel buffer (skb) 是 Linux 内核网络栈(L2 到 L4)处理网络包(packets)所使用的 buffer,它的类型是 sk_buffer。简单来说,一个 skb 表示 Linux 网络栈中的一个 packet;TCP 分段和 IP 分组生产的多个 skb 被一个 skb list 形式来保存。
struct sock 有三个 skb 队列(sk_buffer queue),分别是 rx , tx 和 err。
struct sk_buff {
/* These two members must be first. */ # packet 可以存在于 list 或者 queue 中,这两个成员用于链表处理
struct sk_buff *next;
struct sk_buff *prev;
struct sk_buff_head *list; #该 packet 所在的 list
...
struct sock *sk; #跟该 skb 相关联的 socket
struct timeval stamp; # packet 发送或者接收的时间,主要用于 packet sniffers
struct net_device *dev; #这三个成员跟踪该 packet 相关的 devices,比如接收它的设备等
struct net_device *input_dev;
struct net_device *real_dev;
union { #指向各协议层 header 结构
struct tcphdr *th;
struct udphdr *uh;
struct icmphdr *icmph;
struct igmphdr *igmph;
struct iphdr *ipiph;
struct ipv6hdr *ipv6h;
unsigned char *raw;
} h;
union {
struct iphdr *iph;
struct ipv6hdr *ipv6h;
struct arphdr *arph;
unsigned char *raw;
} nh;
union {
unsigned char *raw;
} mac;
struct dst_entry *dst; #指向该 packet 的路由目的结构,告诉我们它会被如何路由到目的地
char cb[40]; # SKB control block,用于各协议层保存私有信息,比如 TCP 的顺序号和帧的重发状态
unsigned int len, #packet 的长度
data_len,
mac_len, # MAC header 长度
csum; # packet 的 checksum,用于计算保存在 protocol header 中的校验和。发送时,当 checksum offloading 时,不设置;接收时,可以由device计算
unsigned char local_df, #用于 IPV4 在已经做了分片的情况下的再分片,比如 IPSEC 情况下。
cloned:1, #在 skb 被 cloned 时设置,此时,skb 各成员是自己的,但是数据是shared的
nohdr:1, #用于支持 TSO
pkt_type, #packet 类型
ip_summed; # 网卡能支持的校验和计算的类型,NONE 表示不支持,HW 表示支持,
__u32 priority; #用于 QoS
unsigned short protocol, # 接收 packet 的协议
security;
Linux内核网络子系统中的核心数据结构skbuff进行分析,以2.6.21-7的内核来分析,其余版本可能存在差别。
以下几个与skbuff有关的问题:
1.几个长度有关的成员变量:skb->len,skb->data len,skb->truesize之间的关系,还包含skbheadlen(),skbpagelen()等,分别在何种环境下使用?
2.几个引用计数的区别:skb->users,skb->cloned,skb shared info->dataref:
3.几个指针的关系和移动:head/data/tail/end,h.raw,nh.raw,mac.raw;
4.与skb共享复制有关的几个操作有什么区别?
5.skb分配,释放的实现细节;网络子系统中会在哪些地方分配skb,有哪些区别?
6.skb的数据区分为哪几部分?为什么需要这么多种类,分别应用在何种场景?互相之间的转化关系如何?
当网络包被内核处理时,底层协议的数据被传送更高层,当数据传送时过程反过来。由不同协议产生的数据(包括头和负载)不断往下层传递直到它们最终被发送。因为这些操作的速度对于网络层的表现至关重要,内核使用一个特定的结构叫做 sk_buff, 其定义文件在 skbuffer.h。Socket buffer被用来在网络实现层交换数据而不用拷贝来获取数据包 –这显著获得速度收益。
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
