TCP/UDP的对比,粘包分包抓包,http协议

2024-08-24 08:44

本文主要是介绍TCP/UDP的对比,粘包分包抓包,http协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

服务器端:

一、loop  127.0.0.1本地回环测试地址

二、tcp特点

面向连接、可靠传输、字节流

粘包问题:tcp流式套接字,数据与数据之间没有套接字,导致可能多次的数据粘到一起

解决方法:(1)规定一些数据与数据之间的间隔符号:\r 、\n

                  (2)指定要发送的数据的长度。

                   (3)将数据打包:定义结构体

                        struct msg:int size,char data                              

                         struct msg data = {5,"1.txt"};

TCP

UDP
面向连接无连接
可靠传输不可靠
字节流

数据报

三、

(1)send函数,用于将数据从套接字发送到连接的另一端,是网络的专用函数。

int send( SOCKET , const char FAR *buf, int len, int flags );

第一个参数指定发送端套接字描述符;

第二个参数指明一个存放应用程序要发送数据的缓冲区;

第三个参数指明实际要发送的数据的字节数;

第四个参数一般置0。

(2)recv函数用于从套接字接收数据,用法与send相似。

完整性:send 和 recv 可能不会一次性传输所有数据,尤其是对于较大的数据量。在发送和接收数据时,可能需要在应用层进行多次调用来保证数据的完整传输。

tcp传输文件内容:

客户端、服务器端:

#include <head.h>int connect_server(const char *ip,const char *port)
{int fd = socket(AF_INET,SOCK_STREAM,0);if (fd < 0)handle_error_ret("socket fail");struct sockaddr_in seraddr;memset(&seraddr,0,sizeof(seraddr));seraddr.sin_family = AF_INET;seraddr.sin_addr.s_addr = inet_addr(ip);seraddr.sin_port = htons(atoi(port));//"50000"  if (connect(fd,(const struct sockaddr *)&seraddr,sizeof(seraddr)) < 0)handle_error_ret("connect_server fail");return fd;
}//./cli 127.0.0.1 50000 filename 
int main(int argc, const char *argv[])
{if (argc != 4){printf("usage: %s <ip> <port> <filename>\n",argv[0]);return -1;}int fd = connect_server(argv[1],argv[2]);if (fd < 0)return -1;int fd_s = open(argv[3],O_RDONLY);if (fd_s < 0)handle_error_ret("open fail");//write(fd,argv[3],strlen(argv[3])+1);write(fd,argv[3],strlen(argv[3]));//方式1 //sleep(1);//方式2 write(fd,"\r\n",2);char buf[100] = {0};int ret = 0;while (1){ret = read(fd_s,buf,sizeof(buf));if (ret == 0)break;write(fd,buf,ret);}close(fd_s);close(fd);return 0;
}
#include <head.h>int init_server(const char *ip,const char *port)
{int fd = socket(AF_INET,SOCK_STREAM,0);if (fd < 0)handle_error_ret("socket fail");struct sockaddr_in seraddr;memset(&seraddr,0,sizeof(seraddr));seraddr.sin_family = AF_INET;seraddr.sin_addr.s_addr = inet_addr(ip);seraddr.sin_port = htons(atoi(port));//"50000"  if (bind(fd,(const struct sockaddr*)&seraddr,sizeof(seraddr)) < 0)handle_error_ret("bind fail");if (listen(fd,5) < 0)handle_error_ret("listen fail");return fd;}//./ser 127.0.0.1 50000 
int main(int argc, const char *argv[])
{int ret = 0;if (argc != 3){printf("Usage: %s <ip> <port>\n",argv[0]);return -1;}int listenfd = init_server(argv[1],argv[2]);if (listenfd < 0)return -1;int connfd = 0;if ((connfd = accept(listenfd,NULL,NULL)) < 0)handle_error_ret("accept fail");//读文件名 char buf[100] = {0};FILE *fp = fdopen(connfd,"r");if (fp == NULL)handle_error_ret("fdopen fail");fgets(buf,sizeof(buf),fp);  //buf => 1.txt\r\nbuf[strlen(buf)-2] = '\0';//	ret = read(connfd,buf,sizeof(buf));
//	printf("ret = %d buf = %s\n",ret, buf);printf("buf = %s\n",buf);int fd_d = open(buf,O_WRONLY|O_CREAT|O_TRUNC,0666);if (fd_d < 0)handle_error_ret("open fail");while (1){//ret = read(connfd,buf,sizeof(buf));ret = fread(buf,1,sizeof(buf),fp);printf("ret = %d buf1 = %s \n",ret,buf);if (ret == 0)break;write(fd_d,buf,ret);}close(fd_d);close(connfd);return 0;
}

四、远程访问:

window系统打开命令行,ping一下linux系统的ip地址,检测是否能连接,telnet+ip进入到linux操作系统中。

wireshark抓包工具:检查传输的文件流

五、http协议:

HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

HTTP 是一种应用层协议,是基于 TCP/IP 通信协议来传递数据的,其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现,HTTP3.0 基于 UDP 实现。现主流使用 HTTP1.0 和 HTTP3.0

协议: 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。

通俗点讲,协议就是要保证网络通信的双方,能够互相对接上号。就像是两个人传递纸条通过互相指定的暗号,如果发送天亮了,表示可以打游戏了等等

注意: 当我们访问一些网页时,是显示通过 HTTPS 来进行通信的,并且当下大多数的网页都是通过 HTTPS 来进行通信的,因为 HTTPS 在 HTTP 的基础上做了一个加密的工作。

2. HTTP 协议的工作过程

当我们在浏览器输入一个网址,此时浏览器就会给对应的服务器发送一个 HTTP 请求,对应的服务器收到这个请求之后,经过计算处理,就会返回一个 HTTP 响应。并且当我们访问一个网站时,可能涉及不止一次的 HTTP 请求和响应的交互过程。

基础术语:

客户端: 主动发起网络请求的一端

服务器: 被动接收网络请求的一端

请求: 客户端给服务器发送的数据

响应: 服务器给客户端返回的数据

HTTP 协议的重要特点: 一发一收,一问一答

注意: 网络编程中,除了一发一收之外,还有其它的模式

多发一收:例如上传大文件

一发多收:例如看直播时,搜索一个词条可以得到多个视频源

多发多收:例如串流(steam link、moonlight 等等)

这篇关于TCP/UDP的对比,粘包分包抓包,http协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101994

相关文章

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Python WSGI HTTP服务器Gunicorn使用详解

《PythonWSGIHTTP服务器Gunicorn使用详解》Gunicorn是Python的WSGI服务器,用于部署Flask/Django应用,性能高且稳定,支持多Worker类型与配置,可处... 目录一、什么是 Gunicorn?二、为什么需要Gunicorn?三、安装Gunicorn四、基本使用启

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.