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

day 36 tcp协议粘包问题 http协议

1.抓包工具

在这里插入图片描述

2.粘包问题

TCP协议是面向字节流的协议,接收方不知道消息的界限,不知道一次提取多少数据,这就造成了粘包问题。

	**粘包问题出现的原因:** 

	 1. 发送端:需要等缓冲区满时才发送出去,造成粘包;

     2. 接收端:不及时的接收缓冲区内的包,造成多个包接收。

	**避免粘包问题的方法:**

    1. 控制数据的发送速率。
    2. 发送指定大小的数据(受发方统一)
         结构体
        发 : sizeof(结构体);
        收:  sizeof(结构体);
        结构体在不同平台字节对齐不一致问题。

   3. 封装数据帧,应用层根据封装的数据帧进行解析
        帧头 :    1个字节  0xAA   0x5A   0xA5   0x7E
        数据长度:1个字节/2个字节    有效数据的字节数(不包含帧头和帧尾)
        校验:8bits和校验:数据累加求和取低8bits
                   16bits和校验:数据累加求和取低16bits
                   CRC校验:
        帧尾: 1个字节     0xBB  0x55  0xA5
	 
 **TCP报文头**
20——60个字节
1.源端口号
2.目的端口号
3.序列号
对于文本数据字节排序
4.确认号:为了确认收到正确的数据,对于收到的数据排序;
5.标志位:	
	1. URG: 紧急指针标志, 为1时表示紧急指针有效, 该报文应该优先传送。
	2. ACK: 确认应答标志
	3. PSH:  表示发送数据,提示接收端从TCP接收缓冲区中读走数据,为接收后续数据腾出空间
	4. RST: 重置连接标志
	5. SYN: 表示请求建立一个连接
	6. FIN: finish标志, 表示释放连接
6.滑动窗口大小:是TCP流量控制得一个手段。通过调节窗口大小
				控制发送数据的速度,从而达到流量控制,16bit,因而窗口最大65535.
					

还有数据偏移,保留字段,紧急指针等

7. TCP的机制:
	TCP复杂是因为它既要保证可靠性,同时又要尽可能的提高性能。

	可靠性:

		(1)三次握手和四次挥手机制
		
		 (2) 确认应答:TCP将每个字节的数据都进行了编号,即为序列号。每一个ACK都带有对应的确认序列号,保证数据不丢失的按序到达

		(3)超时重传:当发送端发送的数据在网络中丢失时,在一定时间内没有收到接收端的ACK,则发送端会重新发送丢失数据。

		(4)流量控制:按照ACK中“窗口大小”字段控制发送端的发送速度


	提高性能:

		(1)滑动窗口:可以按照“窗口大小”, 一次发送多条后, 再等待应答。

		(2)延迟应答:当接收方处理速度很快时,可以延迟发送ACK,此时"窗口大小"会自动增大

		(3)捎带应答:搭载应用层的响应报文发送ACK。

3.http协议


	
	
应用层:HTTP协议:

1. 万维网

	WWW(World Wide Web)
	世界范围内的,联机式的信息储藏所。	
	万维网解决了获取互联网上的数据时需要解决的以下问题:
	
	1)怎样标识分布在整个互联网上的文档  URL
	2)用什么样的协议实现万维网上的各种链接  HTTP
	3)怎么使用户能够方便的查看文档数据 HTML 

2.URL
	统一资源定位符
	表示从因特网上得到的资源位置和访问这些额资源的方法。
	
	格式:
	<协议>://<主机>:<端口>/<路径>
	端口一般80可省略
	

3.HTTP
	HyperText Transfer Protocol
	超文本传输协议
	超文本:集文字,图像,音频,链接等于一体的文本
	应用层

	1. HTTP工作过程:
		1)建立TCP连接
		2)客户端向服务器发送HTTP请求报文
		3)服务器向客户端发送HTTP响应报文
		4)释放TCP连接
	
	2.HTTP报文格式
		
		请求报文:请求行、消息报头、请求正文
		响应报文:状态行、消息报头、响应正文
		
	3.请求方式
		GET     请求获取Request-URI所标识的资源
		POST    在Request-URI所标识的资源后附加新的数据
		HEAD    请求获取由Request-URI所标识的资源的响应消息报头
		PUT     请求服务器存储一个资源,并用Request-URI作为其标识
		DELETE  请求服务器删除Request-URI所标识的资源
		TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断
		OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
		CONNECT 用于代理服务器
	
	4.状态码

		1xx:指示信息--表示请求已接收,继续处理
		2xx:成功--表示请求已被成功接收、理解、接受
		3xx:重定向--要完成请求必须进行更进一步的操作
		4xx:客户端错误--请求有语法错误或请求无法实现
		5xx:服务器端错误--服务器未能实现合法的请求

		200 OK      //客户端请求成功
		400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
		401 Unauthorized //请求未经授权 
		403 Forbidden  //服务器收到请求,但是拒绝提供服务
		404 Not Found  //请求资源不存在,eg:输入了错误的URL
		500 Internal Server Error //服务器发生不可预期的错误
		503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
	

4.练习——封装数据帧

nt pack_net_data(data_t data , unsigned char *pack)
{
    int i = 0;

    pack[i++]= 0xAA;
    pack[i++] = 20;
    memcpy(&pack[i], &data.temp, sizeof(data.temp));//多个字节用memcpy
    i+=sizeof(data.temp);
    memcpy(&pack[i], &data.hum, sizeof(data.hum));
    i+=sizeof(data.temp);
    memcpy(&pack[i], &data.oxy, sizeof(data.oxy));
    i+=sizeof(data.temp);

    int year = data.tim.tm_year+1900;
	memcpy(&pack[i], &(year), sizeof(data.tim.tm_year));
	i+=sizeof(data.tim.tm_year);
	
	pack[i++] = data.tim.tm_mon+1;
	pack[i++] = data.tim.tm_mday;
	pack[i++] = data.tim.tm_hour;
	pack[i++] = data.tim.tm_min;
	pack[i++] = data.tim.tm_sec;

	for (int j = 1; j < i; j++)
	{
		pack[i] += pack[j];
	}
	i++;
	pack[i] = 0xBB;
	i++;
	return i; 
}


http://www.kler.cn/a/488391.html

相关文章:

  • 《解锁图像的语言密码:Image Caption 开源神经网络项目全解析》
  • Vue进阶(贰幺贰)npm run build多环境编译
  • Jenkins-持续集成、交付、构建、部署、测试
  • VS2022 安装和配置 vcpkg
  • ue5 蒙太奇,即上半身动画和下半身组合在一起,并使用。学习b站库得科技
  • 接口测试-postman(使用postman测试接口笔记)
  • 定时器中断方式
  • VUE + pdfh5 实现pdf 预览,主要用来uniappH5实现嵌套预览PDF
  • openGauss系列 --启动和停止服务器
  • Garnet:微软官方基于.Net 8开源缓存系统,可无需任何改动直接替代Redis,而且还更高性能!
  • S变换matlab实现
  • 2025 最新React面试题
  • 【ASP.NET学习】Web Forms创建Web应用
  • Moq与xUnit在C#单元测试中的应用
  • 比亚迪夏直插家用MPV腹地,“迪王”开启全面销冠新征程
  • 观察者模式详解
  • HTTP-响应协议
  • React Context用法总结
  • Rancher运维三板斧:告警设置、日志管理与数据备份恢复
  • 走进 JavaScript 世界:掌握核心技能
  • Golang中使用 Mqtt
  • 计算机网络 笔记 数据链路层 2
  • docker(目录挂载、卷映射)
  • HTML实战课堂之启动动画弹窗
  • 高级软件工程-复习
  • CancerGPT :基于大语言模型的罕见癌症药物对协同作用少样本预测研究