Raw Socket(二)循环队列收发数据

       完整代码在:
       添加链接描述
       其中tcp_handshake文件夹是实现TCP三次握手的demo。

       完整代码参考:
       https://github.com/praveenkmurthy/Raw-Sockets

       代码实现基于raw socket的TCP协议,发送http请求包并接收回包,解析回包并将payload写入文件,也可使用http get请求直接下载小文件。

演示

       1.请求http服务器

       wireshark抓包:
在这里插入图片描述
       查看写入文件:
在这里插入图片描述

       2.使用get请求下载文件
在这里插入图片描述
       wireshark抓包:
在这里插入图片描述
       查看本地下载文件:
在这里插入图片描述

       3.请求http网站(以2345网址导航为例)
       使用网站测试会出现tcp校验和失败的情况:
在这里插入图片描述
       但是接收http数据包并写入文件是正常的:
在这里插入图片描述

收发数据流程

在这里插入图片描述
在这里插入图片描述
       发送http请求包:

	snprintf(get_command, 1024,
			"GET %s HTTP/1.1\r\nHost: %s\r\nConnection: keep-alive\r\nAccept: text/html\r\nAccept-Language:en-US\r\n\r\n",
			get_request_url, dst);

       然后开始发送数据和接收数据,整个过程上面流程图已经描述的很详细了,主要是依靠两个循环队列进行接收和发送数据。
在这里插入图片描述
       循环队列有两个指针,head和tail,tail用来向队列中写入数据,head用于从队列中读取数据。

       发送函数send_data构造数据包并将数据包写入发送循环队列,并向发送线程发送信号,判断发送循环队列是否满队,若满队,则挂起当前线程,等待队不空的信号,若队列不满,循环队列尾指针tail加一。
       发送线程收到信号后从发送循环队列获取数据包,并将当前head指向的数据包地址置空,然后让head加一。判断数据包长度是否大于拥塞窗口和服务端接收窗口的最小值,定时挂起线程,直到拥塞窗口的值更新到大于数据包长度。最后发送数据包,发送数据包函数send_tcp_segment包括超时重传功能,当前发送的数据包若超时未收到回应,则重新发送未收到回应的数据包。

       接收线程收到数据包后,先判断序列号是否正确,然后判断是否是RST包,如果不是并且数据包长度不为0的话,handle_received_data函数处理数据包,即将数据包写入接收循环队列,并发送信号给接收函数receive_data,然后判断接收队列是否队满,如果队满,则挂起线程,等待队不满。如果接收队列队不满的话,tail指针指向下一个空地址,等待下一个数据包的写入。
       接受线程写完接收循环队列后,需判断当前TCP连接的状态,这些状态包括SYN_SENT、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、CLOSING、LAST_ACK、CLOSED。当TCP状态不是四次握手(即断开连接)过程时,调用process_ack处理服务端回应的数据包,具体做了什么可以看注释。然后发送回应包send_ack_segment(0)。

       接收函数receive_data收到信号得知接收循环队列不为空时,开始从接收循环队列中读取数据,并从packet->offset[DATA_OFFSET]中获取TCP包的数据部分,即原始的http数据包,代码中有chunked和非chunked两种http数据包的处理方式,支持解析http 200响应包和http 302响应包,我把处理302的注释了,因为我暂时不知道怎样构造http 302响应包,嘿嘿。。(挠头)
至于解析http数据包并写入文件或直接下载文件这个逻辑,可以看代码,我注释了一些。大部分http网站内容有base64加密,后面有时间可以加上base64解密功能(遥遥无期。。)

       以上就是Raw Socket(二)循环队列收发数据的基本内容,其中超时重传和拥塞控制功能可以看代码理解,注释我也写了一点,并不难,后面有时间我再补上吧。。。累。。

       欢迎交流!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【自学安全防御】二、防火墙NAT智能选路综合实验

任务要求: (衔接上一个实验所以从第七点开始,但与上一个实验关系不大) 7,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 8,分公司设备可以通过总…

mitmproxy介绍及使用

mitmproxy介绍 mitmproxy又名中间人攻击代理,是一个抓包工具,类似于WireShark、Filddler,并且它支持抓取HTTP和HTTPS协议的数据包,只不过它是一个控制台的形式操作。另外,它还有两个非常有用的组件,一个mi…

openlayers WebGLPoints图层应用(光环、光晕扩散收缩)

本篇介绍一下使用 openlayers WebGLPoints图层应用(光环、光晕扩散收缩) 1 需求 WebGL渲染的光环、光晕扩散收缩 2 分析 WebGLPoints图层应用ol/expr/expression 的简单使用官网解释 WebGLPoints 的 style 属性比较多(基本都是图标、填充…

CSS选择器(1)

以内部样式表编写CSS选择器&#xff0c;其主要编写在<head></head>元素里&#xff0c;通过<style></style>标签来定义内部样式表。 基本语法为&#xff1a; 选择器{ 声明块 } 声明块&#xff1a;是由一对大括号括起来&#xff0c;声明块中是一个一个的…

03MFC画笔/画刷/画椭圆/圆/(延时)文字

文章目录 画实心矩形自定义画布设计及使用连续画线及自定义定义变量扇形画椭圆/圆输出颜色文本定时器与定时事件画实心矩形 自定义画布设计及使用 连续画线及自定义定义变量 扇形 画椭圆/圆 输出颜色文本

杰发科技AC7801 —— __attribute__指定地址存储常量

const uint8_t usFlashInitVal[] __attribute__((at(0x08002800))) {0x55,0x55,0x55,0x55,0x55};//定位在flash中&#xff0c;0x00030000开始的6个字节信息固定 注意7801的地址在8000000之后 如地址选0x00000800烧录时候报错 不知道是不是atclinktool的bug&#xff0c;使用_…

缓存穿透,缓存雪崩,使用互斥锁解决缓存击穿

20240716学习redis 一、缓存穿透1. isNotBlank()方法和isNotEmpty()方法的区别2. 缓存穿透3. 缓存雪崩4. 缓存击穿的解决5 ctrlaltT&#xff0c;可以快速生成包围方式&#xff1a;6 //模拟重建延时7. 代码 &#xff08;使用互斥锁&#xff09; 一、缓存穿透 1. isNotBlank()方…

Linux系统编程-线程同步详解

线程同步是指多个线程协调工作&#xff0c;以便在共享资源的访问和操作过程中保持数据一致性和正确性。在多线程环境中&#xff0c;线程是并发执行的&#xff0c;因此如果多个线程同时访问和修改共享资源&#xff0c;可能会导致数据不一致、竞态条件&#xff08;race condition…

15 - matlab m_map地学绘图工具基础函数 - 一些数据转换函数(二)

15 - matlab m_map地学绘图工具基础函数 - 一些数据转换函数&#xff08;二&#xff09; 0. 引言1. 关于m_geodesic2. 关于mygrid_sand23. 结语 0. 引言 通过前面篇节已经将m_map绘图工具中大多绘图有关的函数进行过介绍&#xff0c;已经能够满足基本的绘图需求&#xff0c;本节…

我想做信号通路分析,但我就是不想学编程

“我想做信号通路分析&#xff0c;但我就是不想学编程。” “我又不是生信狗&#xff0c;学代码会死。” “你们这些做生信的&#xff0c;整天把数据分析搞得神神秘秘&#xff0c;不就是怕被人抢饭碗而已嘛。” “这都没分析出我想要的结果&#xff0c;不靠谱。” “你们做…

Go语言中GC(垃圾回收回收机制)三色标记与混合写屏障

5、Golang三色标记混合写屏障GC模式全分析 (yuque.com) 第1讲-课程目标_哔哩哔哩_bilibili Golang三色标记GC混合写屏障 Go V1.3之前的标记清除&#xff08;mark and sweep) 垃圾回收、内存管理、自动适放、三色标记法、STW (stop the world) 图的遍历&#xff1f;可达性分…

路网双线合并单线——ArcGISpro 解决方法

路网双线合并成单线是一个在地图制作、交通规划以及GIS分析中常见的需求。双线路网定义&#xff1a;具有不同流向、不同平面结构的道路。此外&#xff0c;车道数较多的道路&#xff08;例如&#xff0c;双黄实线车道数大于4的道路&#xff09;也可以视为双线路网&#xff0c;本…

走,戴上你的旅行搭子去探险吧

如今快节奏的生活经常会让人感到疲惫和压力&#xff0c;炎炎夏日&#xff0c;一直想给自己松松绑&#xff01; 最近我和我的的小伙伴们去户外探险了&#xff0c;三五好友&#xff0c;组队出去玩&#xff0c;真的很让人放松&#xff01;一起去户外呼吸大自然的空气&#xff0c;…

【Hot100】LeetCode—155. 最小栈

目录 题目1- 思路2- 实现⭐155. 最小栈——题解思路 3- ACM 实现 题目 原题连接&#xff1a;155. 最小栈 1- 思路 思路 最小栈 ——> 借助两个栈来实现 2- 实现 ⭐155. 最小栈——题解思路 class MinStack {Stack<Integer> data;Stack<Integer> min;public …

VUE:跨域配置代理服务器

//在vite.config。js中&#xff0c;同插件配置同级进行配置server:{proxy:{"/myrequest":{//代理域名&#xff0c;可自行修改target:"https://m.wzj.com/",//访问服务器的目标域名changeOrigin:true,//允许跨域configure:(proxy,options) > {proxy.on(&…

图片常用的压缩方法,适用多种常用图片格式

jpg、png、jpeg、gif等图片格式是日常最常用的三种图片类型&#xff0c;一般在使用或者上传图片的时候这几种是比较常用的格式。在使用图片的时候&#xff0c;最常见的一个问题就是图片太大需要缩小后才可以正常使用&#xff0c;那么有什么方法或者工具能够快速处理不同图片格式…

在Mac上免费恢复已删除的PowerPoint文件

Microsoft PowerPoint for Mac 允许您在 macOS 环境中访问您熟悉的 PowerPoint 工具。该软件是Mac版Microsoft Office套件的一部分&#xff0c;具有各种稳定版本&#xff0c;即。PowerPoint 2019、2016、2011 等 PowerPoint for Mac 与 Apple 自己的演示应用程序 Keynote 兼容…

组网升级,双击热备和宽带管理

拓扑 要求&#xff1a; 要求12&#xff1a; 要求13&#xff1a; 要求14&#xff1a; 要求15&#xff1a; 要求16&#xff1a;

记录些MySQL题集(2)

MySQL 不使用limit的分页查询 limit问题&#xff1a;limit&#xff0c;offset递增问题。随着offset的增加&#xff0c;条数不变&#xff0c;耗时却增加了。 limit 0,10 耗时1ms limit 300000,10 耗时152ms limit 600000,10 耗时312ms 毫秒级别可能没感觉。假…

netdata 监控软件安装与学习

netdata官网 netdata操作文档 前言&#xff1a; netdata是一款监控软件&#xff0c;可以监控多台主机也可以监控单台主机&#xff0c;监控单台主机时&#xff0c;开箱即用&#xff0c;web ui很棒。 环境&#xff1a; [root192 ~]# cat /etc/system-release CentOS Linux rel…