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

news2024/11/24 15:28:54

目录

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.coloradmin.cn/o/2211824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java+vue部署版本反编译

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

C++STL(2)

queue(队列) queue是一种先进先出的数据结构。 queue提供了一组函数来操作和访问元素&#xff0c;但它的功能相对较简单。 push(x):在队尾插入元素 x pop():弹出队首元素 front():返回队首元素 back():返回队尾元素 empty():检查队列是否为空 size0:返回队列中元素的个数 pri…

Android ViewModel

一问&#xff1a;ViewModel如何保证应用配置变化后能够自动继续存在&#xff0c;其原理是什么&#xff0c;ViewModel的生命周期和谁绑定的? ViewModel 的确能够在应用配置发生变化&#xff08;例如屏幕旋转&#xff09;后继续存在&#xff0c;这得益于 Android 系统的 ViewMod…

模拟电子电路基础(常见半导体+multisim学习1)

目录 1.半导体的基础 1.1.半导体基础知识 1.1.1本征半导体 1.1.2杂质半导体 1.1.3PN结 1.2半导体二极管 1.2.1半导体二极管的几种常见结构 1.2.2二极管的伏安特性曲线 1.2.3二极管的主要参数 1.2.4二级管的等效电路 1.2.5稳压二极管 1.2.其他类型二极管 2.multisim的…

双目视觉搭配YOLO实现3D测量

一、简介 双目&#xff08;Stereo Vision&#xff09;技术是一种利用两个相机来模拟人眼视觉的技术。通过对两个相机获取到的图像进行分析和匹配&#xff0c;可以计算出物体的深度信息。双目技术可以实现物体的三维重建、距离测量、运动分析等应用。 双目技术的原理是通过两…

Docker-nginx数据卷挂载

数据卷&#xff08;volume&#xff09;是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。 以Nginx为例&#xff0c;我们知道Nginx中有两个关键的目录&#xff1a; html&#xff1a;放置一些静态资源conf&#xff1a;放置配置文件 如果我们要让Nginx代理我们…

java项目之厨艺交流平台设计与实现(源码+文档)

项目简介 厨艺交流平台设计与实现实现了以下功能&#xff1a; 厨艺交流平台设计与实现的主要使用者管理员管理用户信息&#xff0c;可以添加&#xff0c;修改&#xff0c;删除用户信息信息。 &#x1f495;&#x1f495;作者&#xff1a;落落 &#x1f495;&#x1f495;个人…

分享一个从图片中提取色卡的实现

概述 最近在做“在线地图样式配置”的功能的时候&#xff0c;发现百度地图有个功能时上传一张图片&#xff0c;从图片中提取颜色并进行配图。本文就简单实现一下如何从图片中提取色卡。 效果 实现 实现思路 通过canvasdrawImage绘制图片&#xff0c;并通过getImageData获取…

主数据系统管理、运维的实践经验与建议

公司在预研一个新的主数据系统&#xff0c;领导问笔者给些建议。结合近两年的主数据系统管理、维护经验&#xff0c;给大致写了一些。 里面少数问题属于目前在运行的主数据系统的系统痛点所致&#xff0c;不过大多数笔者认为是通病&#xff0c;一口气写来已两千字&#xff0c;…

【验证码识别】Python+卷积神经网络算法+人工智能+深度学习+Django网页界面+计算机课设项目+TensorFlow+算法模型

一、介绍 验证码识别&#xff0c;使用Python作为开发语言&#xff0c;通过TensorFlow搭建CNN卷积神经网络算法模型&#xff0c;并通过对收集的几千张验证码图片作为数据集&#xff0c;然后进行迭代训练&#xff0c;最终得到一个识别精度较高的模型文件&#xff0c;然后使用Dja…

Cesium 区域高程图

Cesium 区域高程图 const terrainAnalyse new HeightMapMaterial({viewer,style: {stops: [0, 0.05, 0.5, 1],//颜色梯度设置colors: [green, yellow, blue , red],}});

JS 分支语句

目录 1. 表达式与语句 1.1 表达式 1.2 语句 1.3 区别 2. 程序三大流控制语句 3. 分支语句 3.1 if 分支语句 3.2 双分支 if 语句 3.3 双分支语句案例 3.3.1 案例一 3.3.2 案例二 3.4 多分支语句 1. 表达式与语句 1.1 表达式 1.2 语句 1.3 区别 2. 程序三大流控制语…

66 消息队列

66 消息队列 基础概念 参考资料&#xff1a;消息队列MQ快速入门&#xff08;概念、RPC、MQ实质思路、队列介绍、队列对比、应用场景&#xff09; 消息队列就是一个使用队列来通信的组件&#xff1b;为什么需要消息队列&#xff1f; 在实际的商业项目中&#xff0c;它这么做肯…

shell原理

shell 是个进程 &#xff0c; exe在user/bin/bash [用户名主机名 pwd] snprintf fflush&#xff08;stdout&#xff09;&#xff0c;在没有\n情况下立马输出 strtok 第一个参数null表示传入上个有效参数 命令行中&#xff0c;有些命令必须由子进程执行&#xff0c; 如ls 有些…

【进阶OpenCV】 (11)--DNN板块--实现风格迁移

文章目录 DNN板块一、DNN特点二、DNN函数流程三、实现风格迁移1. 图像预处理2. 加载星空模型3. 输出处理 总结 DNN板块 DNN模块是 OpenCV 中专门用来实现 DNN(Deep Neural Networks,深度神经网络) 模块的相关功能&#xff0c;其作用是载入别的深度学习框架(如 TensorFlow、Caf…

考虑促销因素的医药电商平台需求预测研究

一、考虑促销因素的医药电商平台需求预测研究 一、引言 1. 互联网医疗健康的发展 内容&#xff1a;介绍了在互联网的大背景下&#xff0c;医疗健康行业如何迅速发展&#xff0c;举例了&#xff11;药网和叮当快药等平台提供的服务。重点&#xff1a;互联网医疗用户规模和市场…

《人工智能(AI)和深度学习简史》

人工智能&#xff08;AI&#xff09;和深度学习在过去几十年里有了飞跃式的进步&#xff0c;彻底改变了像计算机视觉、自然语言处理、机器人这些领域。本文会带你快速浏览AI和深度学习发展的关键历史时刻&#xff0c;从最早的神经网络模型&#xff0c;一直到现在的大型语言模型…

【技术支持】家里智能电视不能联网重置小米路由器之路

问题现象 最近家里的路由器出现一点问题&#xff0c;现象是手机和电脑连接wifi后&#xff0c;都可以正常打开网页看视频。 但是小爱同学和小米盒子&#xff0c;都出现网络问题&#xff0c;不能正常播放音乐或者视频。 这是小米盒子的网络问题截图 这是和小米盒子连接的智能电…

骨架提取(持续更新)

一 什么是骨架提取 1.1 简介 骨架提取是图像处理或计算机视觉中的一种技术&#xff0c;用于从二值化图像中提取物体的中心线或轮廓&#xff0c;通常称为“骨架”或“细化图像”。这一技术主要用于简化形状表示&#xff0c;同时保留物体的拓扑结构。 这里我们强调了&#xff…

openpyxl -- Cell

文章目录 CellCell的属性MergedCell 版本&#xff1a;openpyxl - 3.0.10 Cell 创建一个单元格&#xff0c;并存入数据、样式、注释等&#xff1b;openpyxl.cell.cell.Cell;获取cell worksheet_obj[“B3”]&#xff0c;根据coordinate获取cell; 也可直接赋值写入&#xff1b;wo…