当前位置: 首页 > news >正文

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

       欢迎交流!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • pc端注册页面 密码校验规则
  • 解决ESLint和Prettier冲突的问题
  • Python 是一种用途广泛的编程语言,应用于各个领域
  • 观察者模式:构建响应式系统的基石
  • 51单片机-第三节-LCD1602调试工具,矩阵键盘
  • 【eNSP模拟实验】单臂路由实现VLAN间通信
  • 【iOS】—— 继承者链
  • 访问者模式(Visitor Pattern)
  • 监控房价和挂牌数量的工具-以成都房价为例
  • 群晖 搭建alist 记录
  • AWS无服务器 应用程序开发—第十八章 AWS EventBridge
  • AI绘画Stable Diffusion 零基础入门 —AI 绘画原理与工具介绍,万字解析AI绘画的使用教程
  • <Rust>egui部件学习:如何在窗口及部件显示中文字符?
  • 谷歌C语言编码规范详解
  • AI安全入门-人工智能数据与模型安全
  • fetch 从初识到应用
  • Go 语言编译器的 //go: 详解
  • js写一个简单的选项卡
  • Netty源码解析1-Buffer
  • Python 反序列化安全问题(二)
  • Shadow DOM 内部构造及如何构建独立组件
  • webpack4 一点通
  • 前言-如何学习区块链
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 我感觉这是史上最牛的防sql注入方法类
  • 我有几个粽子,和一个故事
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • Spring第一个helloWorld
  • ​马来语翻译中文去哪比较好?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #includecmath
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (4)logging(日志模块)
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (SpringBoot)第七章:SpringBoot日志文件
  • (搬运以学习)flask 上下文的实现
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (力扣题库)跳跃游戏II(c++)
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (四) 虚拟摄像头vivi体验
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .Net - 类的介绍
  • .NET CF命令行调试器MDbg入门(一)
  • .Net IE10 _doPostBack 未定义
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C# 的字符串暂存池
  • .net流程开发平台的一些难点(1)
  • /etc/motd and /etc/issue
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [].slice.call()将类数组转化为真正的数组
  • [c++刷题]贪心算法.N01