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

网络协议---TCP

一、UDP协议

1. 核心特点

  • 数据传输方式:面向数据包传输。
  • 连接特性:无需建立连接即可通信。
  • 可靠性:尽最大努力交付,存在数据丢包、乱序等问题,安全性和可靠性较低。
  • 传输范围:支持一对一、一对多的传输模式。
  • 资源开销:机制简单,网络资源开销小,数据实时性高。

2. 丢包避免方法

  • 发送方降低发送速度,保障接收方有充足时间处理数据。
  • 模仿TCP的应答机制,通过接收方反馈确认数据接收情况。

3. UDP报文头部

  • 总长度:共8字节。
  • 包含字段
    • 源端口号:标识发送方网络进程的端口。
    • 目标端口号:标识接收方网络进程的端口。
    • 长度:UDP报文的整体长度,包括头部和正文。
    • 校验和:用于对数据进行差错校验。

二、抓包工具(Wireshark)

1. 功能

抓取通过设备网卡的网络数据,用于调试和分析网络程序。

2. 使用步骤

  1. 输入命令sudo wireshark启动工具。
  2. 选取要抓取的网卡(如“any”)。
  3. 设置过滤条件。
  4. 开始抓取数据。
  5. 进行一次网络通信以获取数据包。

三、TCP协议

1. 核心特点

  • 数据传输方式:面向数据流传输。
  • 连接特性:通信前必须建立连接。
  • 可靠性:具备安全可靠的传输机制。
  • 资源开销:机制复杂,网络资源开销大。
  • 传输范围:本质上仅支持一对一通信,通过TCP并发方式可实现一对多通信。

2. 连接机制

  • 三次握手(建立连接):确保收发双方在通信前都已准备就绪。过程为客户端发送SYN(请求建立连接标志位),服务端返回SYN+ACK(请求建立连接+响应报文标志位),客户端再发送ACK(响应报文标志位)。

  • 四次挥手(断开连接):确保断开连接前双方都已完成通信。通过四次交互确认双方数据传输结束后断开连接。

3. 编程流程及关键函数

函数功能参数返回值
connect请求与服务端建立连接sockfd(套接字)、addr(服务端地址信息)、addrlen(服务端地址大小)成功返回0,失败返回-1
send发送网络数据sockfd(网络套接字)、buf(数据首地址)、len(发送字节数)、flags(发送方式,0为默认)成功返回实际发送字节数,失败返回-1
listen监听建立三次握手的客户端sockfd(监听套接字)、backlog(最大监听客户端个数)成功返回0,失败返回-1
accept接收客户端连接并产生通讯套接字socket(监听套接字)、address(客户端地址信息)、address_len(客户端地址长度指针)成功返回通讯套接字,失败返回-1
recv从网络套接字接收数据sockfd(通讯套接字)、buf(存放数据首地址)、len(期望接收字节数)、flags(接收方式,0为默认阻塞)成功返回实际接收字节数,失败返回-1,对方断开连接返回0
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:请求与服务端建立连接
参数:sockfd:套接字addr:要连接的服务端的地址信息addrlen:服务端地址大小
返回值:成功:0失败:-1
ssize_t send(int sockfd, const void *buf, size_t len, int flags);功能:发送网络数据
参数:sockfd:网络套接字buf:要发送的数据首地址len:发送的字节数flags:0 :按照默认方式发送
返回值:成功:实际发送的字节数失败:-1
int listen(int sockfd, int backlog);
功能:监听建立三次握手的客户端
参数:sockfd:监听套接字backlog:最大允许监听的客户端个数
返回值:成功:0失败:-1
int accept(int socket, struct sockaddr *restrict address,socklen_t *restrict address_len);
功能:接收建立三次握手的客户端,并产生一个通讯套接字
参数:socket:监听套接字address:客户端的地址信息address_len:客户端地址长的指针
返回值:成功:通讯套接字失败:-1
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:从网络套接字上接收数据
参数:sockfd:通讯套接字buf:存放接收数据的首地址len:期望接收到的字节数flag : 0:默认方式接收(阻塞)
返回值:成功:实际接收到的字节数失败:-1对方断开连接:0

4. 粘包问题

  • 定义:发送方应用层发送的多包数据,在接收方可能被一次读出,产生粘连。
  • 原因
    • 发送方速度快,TCP底层对多包数据重新组帧。
    • 接收方数据处理速度慢,多包数据在接收缓冲区缓存,应用层一次读出。
  • 解决方法
    • 调整发送速率。
    • 发送指定大小数据,接收方按对应大小接收(需注意跨平台结构体对齐问题)。
    • 应用层为数据增加分隔符,按分隔符解析。
    • 封装自定义数据帧格式(含帧头、帧尾、有效数据长度、有效数据、校验等),严格按协议解析。

四、重难点

  1. UDP和TCP的区别。
  2. TCP三次握手和四次挥手机制。
  3. TCP粘包问题及解决方法。
  4. TCP客户端和服务端的编程流程。

五、代码训练

#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include<string.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd < 0){perror("socket error");return -1;}struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(50000);seraddr.sin_addr.s_addr = inet_addr("192.168.0.177");int ret = connect(sockfd, (struct  sockaddr *)&seraddr, sizeof(seraddr));if(ret < 0){perror("connect error");return -1;   }char buff[1024] = {0};while(1){fgets(buff, sizeof(buff), stdin);ssize_t cnt = send(sockfd, buff, strlen(buff), 0);if(cnt < 0){perror("send error");return -1;}printf("cnt = %ld\n", cnt);}close(sockfd);return 0;
}
#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include<string.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd < 0){perror("socket error");return -1;}struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(50000);seraddr.sin_addr.s_addr = inet_addr("192.168.0.177");int ret = bind(sockfd, (struct  sockaddr *)&seraddr, sizeof(seraddr));if(ret < 0){perror("connect error");return -1;   }ret = listen(sockfd, 10);if(ret < 0){perror("listern error");return -1;}int connfd = accept(sockfd, NULL, NULL);if (connfd < 0){perror("accept error");return -1;}char buff[1024] = {0};while(1){ssize_t cnt = recv(connfd, buff, sizeof(buff), 0);if(cnt <= 0){perror("recv error");return -1;}printf("cnt = %ld, buff =%s\n", cnt, buff);memset(buff, 0, sizeof(buff));}close(sockfd);close(connfd);return 0;
}

http://www.dtcms.com/a/348170.html

相关文章:

  • 论文阅读:VACE: All-in-One Video Creation and Editing
  • 机器学习算法-朴素贝叶斯
  • k8sday16调度器
  • Java全栈工程师面试实战:从基础到微服务的深度解析
  • 【运维进阶】高可用和负载均衡技术
  • 港口集装箱编号识别误识率↓79%!陌讯多模态融合算法落地优化
  • 静电服漏检率↓79%!陌讯多模态识别算法在智慧安检的实战解析
  • 下料口堵塞误报率↓79%!陌讯多模态融合算法在工业物料输送的实战解析
  • 电子厂静电释放检测误报率↓81%!陌讯多模态融合算法在安全生产监控的落地实践
  • 【Linux】Java线上问题,一分钟日志定位
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day12
  • lanczos算法的核心——Ritz向量的计算(主要思想为反向映射)
  • 《一次高并发场景下疑难Bug的深度排查与复盘》
  • 基于Langchain框架的DeepSeek-v3+Faiss实现RAG知识问答系统(含完整代码)
  • 【股票数据API接口12】如何获取股票近年分红数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • AI-调查研究-59-机器人 行业职业地图:发展路径、技能要求与薪资全解读
  • Android - 用Scrcpy 将手机投屏到Windows电脑上
  • [创业之路-567]:数字技术、数字产品、数字资产、数字货币、数字企业、数字经济、数字世界、数字人生、数字智能、数字生命
  • 第一个小项目java
  • Linux 软件编程(十)网络编程:网络协议,UDP 与 TCP 知识点
  • 逆光场景识别率↑76%!陌讯多模态融合算法在手机拍照识别的落地实践​
  • 【网络运维】Shell 脚本编程: for 循环与 select 循环
  • ARINC 825板卡的应用
  • vue-pure-admin页面引入和功能添加流程解析
  • Smooze Pro for mac 鼠标手势增强软件
  • 力扣【1277. 统计全为1的正方形子矩阵】——从暴力到最优的思考过程
  • 商超客流密度统计误差率↓35%!陌讯多模态融合算法在零售智慧运营的实战解析
  • 智慧零售商品识别误报率↓74%!陌讯多模态融合算法在自助结算场景的落地优化
  • Ubuntu24.04 安装 Zabbix
  • 使用UE5开发2.5D开放世界战略养成类游戏的硬件配置指南