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

news2024/11/26 13:32:54

       完整代码在:
       添加链接描述
       其中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(二)循环队列收发数据的基本内容,其中超时重传和拥塞控制功能可以看代码理解,注释我也写了一点,并不难,后面有时间我再补上吧。。。累。。

       欢迎交流!

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

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

相关文章

JAVA中的Prim和Dijkstra问题详解

1.概念 Prim算法是一种计算加权无向图的最小生成树的算法。所谓最小生成树,是指一个图的子图,它包含图中所有的顶点,并且有保持图连通的最少的边,且所有边的权值之和最小。Prim算法的基本思想是从图中任意一个顶点开始&#xff0…

Go Web开发框架之Gin

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【香橙派AiPro】基于VGG16的火灾检测模型预测

目录 引言开发板介绍开发板使用准备工作工具文档 拨码开关镜像烧录连接开发板下载MobaXterm网线-SSH连接开发板设置WIFI连接WIFI-SSH连接开发板确定开发板IP方法 Vnc可视化WindowsiPad 开发工具安装 散热风扇基于VGG16的火灾检测模型预测数据集准备目录结构代码操作 安装宝塔最…

pico+unity手柄和摄像机控制初级设置

1、摄像头配置 摄像头模式、floor是追踪原点类型(将根据设备检测到地面的高度来计算追踪原点), Device 模式时,为通常理解的 Eye 模式,不会将根据设备检测到地面的高度来计算追踪原点 选择floor时,修改相…

UE4-初见虚幻引擎

一.创建自己的工程 1.启动 a.通过桌面双击图标来打开对应版本的虚幻引擎 b.通过EPIC启动器开启动虚幻引擎 2.选择或新建项目 ps:高版本虚幻编辑器可以打开低版本的虚幻项目,但是高版本虚幻的项目不可以由低版本的虚幻编辑器打开。 3. 选择要打开的项目 4.选择模版 选…

Linux桌面环境手动编译安装librime、librime-lua以及ibus-rime,提升中文输入法体验

Linux上的输入法有很多,大体都使用了Fcitx或者iBus作为输入法的引擎。相当于有了一个很不错的“地基”,你可以在这个“地基”上盖上自己的“小别墅”。而rime输入法,就是一个“毛坯别墅”,你可以在rime的基础上,再装修…

Win10+Docker环境使用YOLOv8 TensorRT推理加速

这一部分内容和WSL-Ubuntu20.04环境使用YOLOv8 TensorRT推理加速-CSDN博客 是基本相同的,有细微差别我也会在文中指出来。 1.TensorRTX下载 这里使用Wang-xinyu大佬维护的TensorRTX库来对YOLOv8进行推理加速的演示,顺便也验证一下前面环境配置的成果。 github地址:GitHub -…

windows10 背景如何变成护眼淡绿色

windows10 背景如何变成护眼淡绿色,office、输入窗口、网页前景、通讯软件光标全是变绿,保护色。 1、运行窗口输入 regedit 2、计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\DefaultColors\Standard 侧面的window名称数…

浏览器确定是否停留在当前Tab页面

切换页面时打印页面状态如图: 这里用到了visibilitychange事件。 document.addEventListener(visibilitychange,function(){console.log(document.visibilityState)})

Vue和Element UI 路由跳转

在Vue.js中,使用Vue Router可以方便地实现页面之间的路由跳转。Element UI是一个基于Vue 2.0的桌面端组件库,它本身并不直接提供路由跳转的功能,但你可以在使用Element UI的Vue项目中结合Vue Router来实现这一功能。 以下是一个基于Vue和Ele…

JavaScript进阶(四)---js解构

目录 一.定义: 二.类型: 1.数组解构: 1.1变量和值不匹配的情况 1.2多维数组 2.对象解构 3.对象数组解构 4.函数参数解构 5.扩展运算符 一.定义: JavaScript 中的解构(Destructuring)是一种语法糖&…

基于Ubuntu2310搭建openstack高可用集群B版

openstack-ha 环境初始化安装haproxy安装keepalived数据库集群高可用rabbitmq集群高可用memcache集群配置 keystone高可用glance高可用placement高可用nova高可用neutron高可用horizon高可用 本实验使用两台节点master和node配置haproxy高可用,keepliaved配置主备抢…

H5 Svg 半圆圆环占比图

效果图 主逻辑 /* 虚线长度 */ stroke-dasharray /* 偏移 */ stroke-dashoffset 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge&qu…

sentinel网关限流配置及使用

sentinel控制台源码&#xff1a;https://download.csdn.net/download/yixin605691235/89543923 sentinel控制台jar包&#xff1a;https://download.csdn.net/download/yixin605691235/89543931 不同环境直接修改jar包中的application.yml文件中的nacos地址就可以了。 一、网关限…

socket功能定义和一般模型

1. socket的功能定义 socket是为了使两个应用程序间进行数据交换而存在的一种技术&#xff0c;不仅可以使同一个主机上两个应用程序间可以交换数据&#xff0c;而且可以使网络上的不同主机间上的应用程序间进行通信。 2. 图解socket的服务端/客户端模型

MySQL面试篇章——MySQL基础复习

文章目录 MySQL基本介绍MySQL数据类型数值类型字符串类型日期和时间类型ENUM和SET MySQL运算符算数运算符逻辑运算符比较运算符 MySQL常用函数字符串函数数值函数时间和日期函数聚合函数 MySQL完整性约束范式第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#…

<数据集>钢铁缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1800张 标注数量(xml文件个数)&#xff1a;1800 标注数量(txt文件个数)&#xff1a;1800 标注类别数&#xff1a;6 标注类别名称&#xff1a;[crazing, patches, inclusion, pitted_surface, rolled-in_scale, scr…

【C语言】详解结构体(上)

文章目录 前言1. 结构体类型的含义2.结构体的声明2.1 结构体声明的语法2.2 结构体变量的创建和初始化 3.结构体的特殊声明4. 结构体的自引用5.小结 前言 C语言的数据类型分为内置数据类型和自定义的数据类型。所谓的内置的数据类型可以认为是C语言自带的数据类型&#xff08;c…

three完全开源扩展案例03-模型加载

https://www.threelab.cn/three-cesium-examples/public/index.html#/codeMirror?navigationThree.js%E6%A1%88%E4%BE%8B[r166]&classifybasic&idmodelLoad 更多内容&#xff1a;https://threelab.cn/ import * as THREE from three import { OrbitControls } from …

AI+折叠屏,荣耀的创新周期论

文&#xff5c;刘俊宏 编&#xff5c;王一粟 2024年&#xff0c;AI和折叠屏的演进路线&#xff0c;已经成为了手机行业的共识。 首先&#xff0c;手机市场的新增量已经被折叠屏所接管。据Counterpoint Research数据显示&#xff0c;中国2024年第一季度折叠屏手机销量同比增长…