[Linux#66][TCP->IP] 面向字节流 | TCP异常 | filesocket | 网络层IP

目录

1. 面向字节流

思考:对于UDP协议来说,是否也存在“粘包问题”呢?

2.TCP 异常情况

3.知识

1.UDP实现可靠传输(经典面试题)

2. 网络抓包 | 爬虫

3.打通文件和 socket 的关系

4.网络层:IP

前置知识


1. 面向字节流

  • udp 是面向数据报的
  • 文件和 tcp 都是面向字节流的
  • 面向字节流:发什么就按照序号收什么,放在缓冲区,用户层决定一次读取多少
  • udp 发一个,上层就读一个数据报
  • 用户层才有报文的概念,对报文进行处理必须一个一个的处理!将字节流变成一个一个完成的请求

引出了数据包粘包问题:

  • 解决思想:明确报文和报文之间的边界

方法:应用层来解决粘包问题

  1. 定长报文
  2. 特殊符号隔开
  3. 自描述字段(如前面网络版本计数器报头中放着有效载荷长度,我们以\r\n作为间隔把有效载荷长度读到,然后根据有效载荷长度拿到有效载荷)

解释:

  • 对于定长的包, 保证每次都按固定大小读取即可; 如Request结构, 是固定大小的, 那么就从缓冲区从头开始按sizeof(Request)依次读取即可;
  • 对于变长的包, 可以在包头的位置, 约定一个包总长度的字段, 从而就知道了包的结束位置;
  • 对于变长的包, 还可以在包和包之间使用明确的分隔符(应用层协议, 是程序猿自己来定的, 只要保证分隔符不和正文冲突即可)

思考:对于UDP协议来说,是否也存在“粘包问题”呢?

答:不存在

UDP的数据边界

  • UDP报头中包含报文长度字段。
  • 每个UDP报文独立地被交付给应用层,具有明确的数据边界。
  • 从应用层角度来看,使用UDP时要么收到完整的报文,要么不收,不会出现“半个或多个”报文的情况。

TCP与有效载荷长度

  • TCP是面向字节流的协议,其报头仅包含首部长度而没有有效载荷长度字段。
  • TCP通过序号来表征数据起始位置,并利用校验和保证报文完整性。
  • 收到TCP报文后,TCP将报头和有效载荷分离,把数据放入缓冲区形成连续的字节流。
  • TCP不需要区分每个报文的边界,这些由上层应用程序自行处理。

总结

  • UDP不存在“粘包问题”,因为每个报文都是独立的且有明确边界。
  • TCP由于其字节流特性及缺乏有效载荷长度字段,依赖于序号和校验和来管理数据传输,并不负责维护报文边界。报文边界需要应用层处理,例如 http 协议~

2.TCP 异常情况

进程终止

  • 连接本身是和文件相关的,文件的生命周期是随进程的
  • 进程终止:进行正常的四次挥手,连接正常自动断开

机器重启

  • 先要杀掉所有的进程
  • 再四次挥手。然后OS在慢慢关机在重启

机器断电/网线断开

  • 客户端马上就识别到网络发生变化了,但没有机会在和服务器进行四次挥手了,但服务器为连接还在, 一旦服务器有写入操作, 服务器发现连接已经不在了, 就会进行reset.
  • TCP自己也内置了一个保活定时器, 会定期询问对方是否还在. 如果对方不在, 也会把连接释放. 关电源也是一样。

3.知识

1.UDP实现可靠传输(经典面试题)

参考TCP的可靠性机制, 在应用层实现类似的逻辑;
例如:

  • 引入序列号, 保证数据顺序;
  • 引入确认应答, 确保对端收到了数据;
  • 引入超时重传, 如果隔一段时间没有应答, 就重发数据;

如果场景要求非常高,就直接使用 TCP

2. 网络抓包 | 爬虫

网络抓包(Network Packet Capture),指的是捕获在网络中传输的数据包的过程。这是网络监控、故障诊断、协议分析、网络安全审计等领域的常见做法。通过抓取并分析网络中的数据包,可以深入了解网络通信的细节,包括但不限于以下内容:

  1. 数据包内容:可以查看数据包中的具体信息,如源IP地址、目的IP地址、端口号、协议类型(如HTTP、HTTPS、TCP、UDP等)。
  2. 通信流程:分析数据包在通信过程中的时间顺序和流程,了解数据是如何在网络中流动的。
  3. 协议分析:对数据包中的应用层协议进行解码,理解应用程序之间的交互细节。
  4. 性能分析:通过捕获的数据包,可以分析网络延迟、丢包率等性能指标。
  5. 安全问题:检测网络攻击、异常流量、数据泄露等安全威胁。
     

网络抓包通常使用以下工具:

  • Wireshark:一款流行的网络协议分析工具,功能强大,支持多种协议的解析。
  • tcpdump一个命令行式的数据包分析工具,常用于Linux系统中。
  • Microsoft Network Monitor:微软提供的一款网络监控工具,适用于Windows系统。
  • Charles:一个针对HTTP/HTTPS的代理抓包工具,常用于移动应用开发和调试。

进行网络抓包时,通常需要以下步骤:

  1. 选择工具:根据需要选择合适的抓包工具。
  2. 设置过滤器:根据监控目标设置过滤条件,如只捕获特定IP地址或端口号的数据包。
  3. 开始捕获:启动抓包工具开始捕获网络中的数据包。
  4. 分析数据:捕获完成后,分析数据包内容,查找问题所在或获取所需信息。
  5. 保存和分析结果:将捕获的数据包保存下来,以便后续进一步分析。
    网络抓包是一项重要的技能,对于网络管理员、开发人员和网络安全分析师来说尤其如此。然而,需要注意的是,未经授权进行网络抓包可能会侵犯隐私,因此在实际操作时必须遵守相关法律法规和道德规范。

下载 wireshark

网络爬虫Web Crawler),又称为网页蜘蛛(Web Spider)或网络机器人(Web Robot),是一种自动化程序,它按照一定的规则自动地浏览互联网上的网页,以搜集网页上的信息。网络爬虫通常用于以下目的:

  1. 搜索引擎:如谷歌(Google)、百度等搜索引擎使用网络爬虫来索引网页内容,以便用户搜索时能够快速找到相关信息。
  2. 数据挖掘:企业和研究人员可能使用网络爬虫来收集大量的网络数据,用于市场分析、社会研究或学术研究。
  3. 信息监控:监控特定网站或论坛的更新,比如新闻网站、股票市场信息等。
     

网络爬虫的工作原理通常包括以下几个步骤:

  1. 种子URLs:爬虫从一个或多个起始网页(种子URLs)开始工作。
  2. 抓取网页:爬虫访问这些网页,下载网页内容,通常是HTML格式。
  3. 解析内容:解析下载的网页内容,提取链接和需要的数据。
  4. 跟踪链接:从解析出的链接中选择下一批要访问的网页,并重复抓取和解析的过程。
  5. 存储数据:将提取的数据存储在数据库或文件中,供后续处理和分析。
  6. 去重和更新:在爬取过程中,爬虫会尽量避免重复访问相同的网页,并且会定期更新已抓取的网页内容。


网络爬虫需要遵守一些规则和协议,包括:

  • Robots协议(/robots.txt):这是一个位于网站根目录下的文件,它告诉爬虫哪些页面或目录可以抓取,哪些不可以。
  • 网站的使用条款:有些网站明确禁止或限制爬虫的活动,因此爬虫需要遵守这些条款。
  • 法律法规:在某些国家和地区,网络爬虫的活动可能受到法律的限制,特别是在涉及个人隐私和数据保护方面。
     

网络爬虫可以是简单的脚本,也可以是复杂的系统,它们的设计和实现可以根据目标网站的结构、所需的抓取深度和广度、以及抓取数据的用途而有所不同。在使用网络爬虫时,应当尊重网站所有者的权利和用户的隐私,合理合法地使用爬取的数据。

3.打通文件和 socket 的关系

套接字的转化,就是 C 语言的多态

加深对于 传输层+网络层 的理解:

  1. 用特定数据结构表述的协议
  2. 和特定协议匹配的方法集

网络底层是:生产消费者模型

探究上图蓝色荧光笔标记的 wait:struct socket中wait_queue_head_t wait是什么?

在Linux内核中,struct socket 结构体用于表示一个套接字。这个结构体定义在网络子系统的头文件中,例如 <linux/net.h> 或者 <net/sock.h>。其中的 wait_queue_head_t wait 成员是一个等待队列头(wait queue head),它用来管理一组等待特定事件发生的进程。

具体来说,wait_queue_head_t 是一种数据结构,它允许内核将一个或多个进程放入等待状态,直到某个条件满足为止。当条件满足时,内核可以唤醒这些等待的进程,使它们继续执行。在套接字上下文中,wait 通常用于处理读写操作的阻塞情况。

  • 读操作:当应用程序尝试从一个空的接收缓冲区读取数据时,如果没有数据可读,那么读操作会被阻塞。此时,调用进程会被加入到与 socket 相关的 wait 队列中。一旦有新的数据到达,内核会唤醒等待队列中的一个或多个进程。
  • 写操作:如果发送缓冲区已满,写操作也会被阻塞。这时,调用进程同样会被放入 wait 队列。当有足够的空间可用时,内核会唤醒等待的进程。

wait_queue_head_t 的定义如下(简化版):

typedef struct __wait_queue_head {spinlock_t lock;struct list_head task_list;
} __wait_queue_head_t;#define wait_queue_head_t __wait_queue_head_t

这里:

  • spinlock_t lock 是自旋锁,用来保护等待队列。(和生产消费者模型联动起来了~)
  • struct list_head task_list 是一个双向链表,用来存储等待该事件的所有进程的任务结构 task_struct

使用等待队列的基本步骤包括:

  1. 初始化等待队列头。
  2. 将进程添加到等待队列,并设置进程为睡眠状态。
  3. 当条件满足时,唤醒等待队列中的进程。

这种机制是Linux内核实现I/O多路复用和异步I/O的基础之一。通过这种方式,内核能够有效地管理对资源的并发访问,并且能够在资源变为可用时及时通知相关进程。之后的文章会再详细讲解~

  • struct sk_buff(socket buffer的简称)是Linux内核网络子系统中的一个核心数据结构,用于表示和处理网络数据包。它是一个非常重要的结构体,贯穿了整个网络协议栈的数据传输过程,从网络接口接收数据到将数据发送出去,以及在不同协议层之间的数据传递。
  • 封装和解包:本质只要移动指针就可以(实现层和层之间的移动
  • 一个进程的文件,一个缓冲区
  • 传输层,网络层,数据链路层的解包操作都在接收缓冲区中操作,不需要繁琐的拷贝,只是指针移动

  • 要在内核中重新创建大量的数据结构,所以说建立通信是有成本的
  • C语言实现多态的场景:一切皆文件,进程间通信,网络 tcp/udp

4.网络层:IP

tcp究竟做了什么,ip 又扮演了什么角色

一个故事:

张三老爹是教务处主任他要求张三每次数学考试都考100分,张三也很争气,10次数学考试8次都是100分,但是架不住意义可能考了95分。而张三老爹每次必须让张三数学考100分,那张三老爹怎么办呢?他决定之前考试作废,重新考试,如果张三还没有考到,那考试继续作废,直到张三考到100分。

刚才我们两个人,一个教务处主任(张三老爹),张三(儿子)。考试的是张三,他也有能力考到100分,但并不一定每次都考到100。张三没考到没事他还有他老爹,他可以让他儿子继续考。

  • 张三老爹:tcp 协议,提供可靠性
  • 张三:IP ,真正办事的
  • IP 协议的本质:1. 定位主机 2.提供一种能力,将数据跨网络从 A 主机送到 B 主机
  • 用户需要的是可靠的送到的能力
  • 老爹(tcp 可靠的策略)+张三(ip 传输的能力)

只有策略+能力一定能做到将数据从主机A可靠的跨网络送到主机B。

前面tcp学的超时重传、确认应答、流量控制等等全都是策略!具体怎么做有ip来执行!

前置知识

  • 要对所有的主机进行的唯一标识
  • 源 IP:源主机
  • 目的 IP:目的主机

故事:

1.去目标城市 --> 2.去目标地点

  • IP=目标网络+目标主机
  • IP 设计原因:构建网络
  • 路径选择中,目标IP还决定了我们的路径该如何走。
  • 相当于是拿着目的 IP,主机——>进行路径选择路由器——>目标主机

这是一套精心设计过的网络体系!

一个故事

背景:

  • 每个学校都有很多学院如计算机学院、理学院、化工学院、机械学院、电子信息工程学院等等,每个学生也都有自己的学号,这个学号其实是经过精心设置的。这里我们简化一下把学号分成学院号+自己所在院系内的编号。每个学院也都有自己的编号。
  • 每一个学院都有自己院学生会主席并且他还是院群里面的群主,而且他也有属于自己的学号。并且这个学号在全校范围内唯一。每个院学生会主席都还要在加一个校学生会主席群。

事件:

  • 今天电子信息工程学院的一名普通学生李四同学把自己学生证丢了,学生证上面其他信息都模糊看不清了,只有学号(101 00101)可以看得清。
  • 然后计算机学院张三同学(学号:000 01001)在校园内捡到这个学生证。张三同学就想把学生证归还给该同学,但这个学生证只有学号看的请。可是张三除了自己院学生号清楚并不清楚其他院的学号。

方法:

  1. 他知道学号在全校范围内唯一,他要找这个人,因此张三就在食堂门口抓住一个人就问同学你的学号

查找本质是在做排除。如果进行线性遍历,效率太低了,所以就有了我们的方法二

  1. 张三把这张学习卡拍张照片放到院群里@一下院学生会主席王五,他知道王五可以对接外部。然后让王五到校学生会群中去找,确定这个同学是哪个院的

网络通信本质是把数据交给目标主机。

  • 张三:源主机
  • 李四:目表主机
  • 院学生会主席:路由器
  • 院内的群:局域网
  • 校学生会群:公网
  • 捡到的李四钱包中的学号(ip):学院(目标网络)+学号(目标主机)

路由器,认识主机,认识网络目标中的转接,局域网到公网中的查找

为什么第二种方法这么快?因为一次排除一群,做排除的效率更高了。通过校学生会可以直接锁定了电信学院,排除了其他学院

下篇文章继续学习 IP 协议的报头~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/452643.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java逻辑运算符 C语言结构体定义

1. public static void main(String[] args) {System.out.println(true&true);//&两者均为true才trueSystem.out.println(false|false);// | 两边都是false才是falseSystem.out.println(true^false);//^ 相同为false&#xff0c;不同为trueSystem.out.println(!false)…

git 安装

文章目录 一、ubuntu 安装 git二、centos 安装 git三、检查安装 git 一、ubuntu 安装 git sudo apt-get install get -y二、centos 安装 git sudo s install git -y三、检查安装 git git --version出现此标志git版本号&#xff0c;表示git安装完成。

《Effective C++》 笔记

让自己习惯C&#xff0c;Accustoming Yourself to C 1. 视C为一个语言联邦&#xff0c;View Cas a federation of languages. 将 C视为一个由相关语言组成的联邦而非单一语言。在其某个次语言&#xff08;sublanguage&#xff09;中&#xff0c;各种守则与通例都倾向简单、直观…

【win11】终端/命令提示符/powershell美化

文章目录 1.设置字体1.1. 打开win11的终端/命令提示符/powershell其中之一1.2. 打开终端设置&#xff0c;修改所有终端默认字体为新宋体 2. 修改powershell背景色为蓝色 win11的默认终端/命令提示符/powershell主题风格让人感觉与win10撕裂太大&#xff0c;尤其是字体、背景色&…

Excel:vba实现筛选出有批注的单元格

实现的效果&#xff1a;代码&#xff1a; Sub test() Dim cell As RangeRange("F3:I10000").ClearlastRow Cells(Rows.Count, "f").End(xlUp).Row MsgBox lastrow For Each cell In Range("a1:a21")If Not cell.Comment Is Nothing ThenMsgBox…

从DexMV、VideoDex、MimicPlay到SeeDo:从人类视频中学习:机器人的主流训练方法之一

前言 在此文《UMI——斯坦福刷盘机器人&#xff1a;从手持夹持器到动作预测Diffusion Policy(含代码解读)》的1.1节开头有提到 机器人收集训练数据一般有多种方式&#xff0c;比如来自人类视频的视觉演示 有的工作致力于从视频数据——例如YouTube视频中进行策略学习 即最常见…

推荐一款非常优秀的3D建模软件:PTC Creo

PTC Creo是美国PTC公司最新研发出来的一款超级强大的3D建模辅助类大型软件&#xff0c;这款软件是针对产品设计以及开发的软件&#xff0c;它具有一系列3D CAD、CAM、CAE等开发工具和套件&#xff0c;而且可用性极高。从概念设计一直到制造出产品&#xff0c;本软件都可以完成任…

Windows API 一 ----起步

目录 1.介绍主函数入口参数。 2. 简单介绍 Windows.h 这个头文件 小结&#xff0c;也聊一聊 1.介绍主函数入口参数。 第一个参数: HINSTANCE 类型的 参数&#xff0c; 称为“实例句柄“&#xff0c;这个参数唯一标志了我们写的这个程序。 第二个参数&#xff1a; HINSTANCE…

ORA-12541: TNS: 无监听程序

目录 1. 检查服务是否开启2. ip的原因 ORA-12541: TNS: 无监听程序 &#xff08;特别感谢&#xff09;参考链接&#xff1a;https://blog.csdn.net/qq_43540696/article/details/102522292 Traceback (most recent call last): File "D:\D01-software\D01010-PyCharm_co…

Java爬虫:获取直播带货数据的实战指南

在当今数字化时代&#xff0c;直播带货已成为电商领域的新热点&#xff0c;通过直播平台展示商品并进行销售&#xff0c;有效促进了产品的曝光和销售量的提升。然而&#xff0c;如何在直播带货过程中进行数据分析和评估效果&#xff0c;成为了摆在商家面前的一个重要问题。本文…

STM32调试,发现HAL_Init();之后无法调试,甚至无法让程序停下来

参考文档&#xff1a; STM32调试,发现HAL_Init();之后无法调试,甚至无法让程序停下来 - asml - 博客园 症状 最近开始学习STM32Cube,发现新建工程后无法正常调试,过了HAL_Init();之后就无法继续调试了. 无法进行让程序暂停以及停止等操作.并在输出窗口不断刷出 ERROR: Can n…

Golang | Leetcode Golang题解之第486题预测赢家

题目&#xff1a; 题解&#xff1a; func PredictTheWinner(nums []int) bool {return total(nums, 0, len(nums) - 1, 1) > 0 }func total(nums []int, start, end int, turn int) int {if start end {return nums[start] * turn}scoreStart : nums[start] * turn total…

边缘计算技术的优势与挑战

如今&#xff0c;随着5G快速无线网络的到来&#xff0c;将计算存储和物联网&#xff08;IoT&#xff09;分析的部署放在靠近数据产生的地方&#xff0c;使得边缘计算成为可能。 物联网设备和新应用的扩展需要实时计算能力。5G无线正在考虑边缘系统&#xff0c;以快速跟踪支持实…

python中堆的用法

Python 堆&#xff08;Headp&#xff09; Python中堆是一种基于二叉树存储的数据结构。 主要应用场景&#xff1a; 对一个序列数据的操作基于排序的操作场景&#xff0c;例如序列数据基于最大值最小值进行的操作。 堆的数据结构&#xff1a; Python 中堆是一颗平衡二叉树&am…

C语言复习第3章 函数

目录 一、函数介绍1.1 函数是什么1.2 C语言中函数的分类1.3 函数原型1.4 高内聚 低耦合1.5 C语言main函数的位置 二、函数的参数2.1 实参和形参2.2 函数的参数(实参)可以是表达式2.3 传值与传址(swap函数)2.4 明确形参是实参的临时拷贝2.5 void(如果不写函数返回值 默认是int)2…

MySQL 【日期】函数大全(六)

目录 1、TIME_FORMAT() 按照指定的格式格式化时间。 2、TIME_TO_SEC() 将指定的时间值转为秒数。 3、TIMEDIFF() 返回两个时间之间的差值。 4、TIMESTAMP() 累加所有参数并将结果作为日期时间值返回。 5、TIMESTAMPADD() 将指定的时间间隔加到一个日期时间值上并返回结果。…

sql注入盲注详解以及绕过waf方法

盲注 mysql函数普及 exists(): 用于判度条件是否满足&#xff0c;满足返回True&#xff0c;否则返回False if(条件,为真返回的值,为假返回的值)&#xff1a;根据条件真假返回指定的值 length(string)&#xff1a;计算出长度string 可以是任何字符串字面量或者字段名。 substr(…

轻量级可视化数据分析报表,分组汇总表!

什么是可视化分组汇总表&#xff1f; 可视化分组汇总表&#xff0c;是一种结合了数据分组、聚合计算与视觉呈现功能的数据分析展示功能。它能够按照指定的维度&#xff08;如时间、地区、产品类型等&#xff09;对数据进行分组&#xff0c;还能自动计算各组的统计指标&#xf…

JavaWeb 24.Vue3的简介和快速体验

目录 一、Vue3介绍 Vue的两个核心功能 ① 声明式渲染&#xff1a; ② 响应性: 什么是声明式响应 什么是编程式响应 什么是渐进式框架 特点&#xff1a; 二、Vue3快速体验 三、关于JavaScript和TypeScript的选择问题 春风若有怜花意&#xff0c;可否许我再少年 —— 24.10.19 一…

mysql 备份与恢复

目录 一、备份分类与方法 1.1 备份类型 1.2 备份策略 1.3 备份工具 二、完全备份与恢复 2.1 物理冷备 2.2 mysqldump逻辑热 备 &#xff08;1&#xff09;完全备份一个或多个完整的库&#xff08;包括其中所有的表&#xff09; &#xff08;2&#xff09;完全备份 My…