网络协议---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.pswp.cn/bicheng/94545.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94545.shtml

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

相关文章

构建AI智能体:十三、大数据下的“搭积木”:N-Gram 如何实现更智能的语义搜索

一、什么是 N-gram核心定义&#xff1a;N-gram 是来自给定文本或语音序列的 N 个连续项&#xff08;如单词、字符&#xff09; 的序列。它是一种通过查看一个项目的前后文来建模序列的概率模型。N&#xff1a; 代表连续项的数量。项&#xff08;Item&#xff09;&#xff1a; 通…

嵌入式系统学习Day22(进程)

无人机运行程序&#xff0c;时间贴合阻塞态&#xff1a;程序运行到scanf或gets时的状态linux是抢占式操作系统&#xff0c;优先级高的调度高&#xff0c;优先级相同在同样时间内调度相同ip为指针&#xff0c;指向目前已读到进程的位置&#xff0c;回写到磁盘&#xff0c;进行下…

【51单片机】【protues仿真】基于51单片机冰箱系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 1、LCD1602液晶显示冷藏冷冻温度值 2、按键设置温度阈值​ 3、冷藏或冷冻温度高于阈值启动制冷片 4、限位器开关检测门状态&#xff0c;开门过长蜂鸣器警报 5、状态指示灯&#xf…

征程 6X 常用工具介绍

一、采集/设置系统信息的工具集 获取开发板 SOM 状态工具 [LINUX] hrut_somstatus 是用来获取当前开发板SOM状态的工具&#xff0c;包含温度、 cpu频率、bpu状态。 用法&#xff1a; hrut_somstatus [-n count] [-d second]获取开发板boardid工具 [LINUX] hrut_boardid 是用来获…

数字隔离器:新能源系统的安全与效能革命

在新能源技术高速发展的浪潮中&#xff0c;高压、高频、高可靠性的需求对系统设计提出全新挑战。传统隔离器件受限于响应速度、抗干扰能力及体积限制&#xff0c;逐渐难以满足光伏发电、电动汽车、储能系统等场景的严苛要求。数字隔离器以创新的半导体技术为核心&#xff0c;通…

算法训练营day58 图论⑧ 拓扑排序精讲、dijkstra(朴素版)精讲

本篇应该是图论的经典部分了&#xff0c;本篇的内容作为小白没有了解过&#xff0c;但是至少会听说过——拓扑排序精讲、dijkstra&#xff08;朴素版&#xff09;精讲。 拓扑排序精讲 本题是拓扑排序的经典题目。一聊到 拓扑排序&#xff0c;一些录友可能会想这是排序&#xf…

如何在日常开发中高效使用 Copilot

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

使用Docker部署Coze Studio开源版

1、安装Docker# 安装Docker https://docs.docker.com/get-docker/# 安装Docker Compose https://docs.docker.com/compose/install/# CentOS安装Docker https://mp.weixin.qq.com/s/nHNPbCmdQs3E5x1QBP-ueA2、安装Coze Studio详见&#xff1a;https://github.com/coze-dev/coze…

深度剖析Spring AI源码(九):构建企业知识库,深入ETL与RAG实现

深度剖析Spring AI源码&#xff08;九&#xff09;&#xff1a;构建企业知识库&#xff0c;深入ETL与RAG实现 “Data is the new oil, but like oil, it’s valuable only when refined.” —— 在AI时代&#xff0c;原始数据需要经过精心的ETL处理才能成为AI的"燃料"…

C# 简单工厂模式:构建灵活与可扩展的面向对象程序

在面向对象编程&#xff08;OOP&#xff09;的世界中&#xff0c;简单工厂模式&#xff08;Simple Factory Pattern&#xff09; 是一种非常常见且实用的设计模式。虽然它并不属于GoF&#xff08;Gang of Four&#xff09;定义的23种经典设计模式之一&#xff0c;但它是理解更复…

全面解析JVM预热:原理、价值与实践指南

在Java应用的性能优化领域,“JVM预热”是一个常被提及却容易被忽视的关键环节。尤其是在高并发、低延迟的业务场景中,未经过充分预热的JVM可能导致应用启动初期出现响应延迟、吞吐量波动甚至服务不可用的问题。本文将从JVM预热的核心原理出发,深入剖析其价值、常见实现方案及…

数学建模-灰色关联分析(GRA)

目录 1-AI带你认识GRA &#x1f4d8; 一、灰色关联分析&#xff08;GRA&#xff09;简介 1. 什么是灰色关联分析&#xff1f; 2. 核心思想&#xff08;通俗理解&#xff09;&#xff1a; 3. 与熵权法的对比&#xff08;快速类比&#xff09;&#xff1a; &#x1f9e9; 二…

Shell脚本-expect

一、前言在 Linux 系统管理与自动化运维中&#xff0c;我们经常需要编写 Shell 脚本来完成各种任务。但有些命令&#xff08;如 ssh、scp、passwd、ftp 等&#xff09;在执行时会等待用户手动输入密码或确认信息&#xff0c;这就导致脚本无法完全自动化运行。为了解决这个问题&…

Conmi的正确答案——Ubuntu24.04禁用任何休眠

系统&#xff1a;Ubuntu 24.04步骤一、禁用系统休眠服务 # 禁用所有休眠/待机相关服务&#xff08;立即生效&#xff09; sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target # 验证状态&#xff08;显示 "masked" 即成功&am…

开源 C++ QT Widget 开发(二)基本控件应用

文章的目的为了记录使用C 进行QT Widget 开发学习的经历。临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 C QT Widget 开发&#xff08;一&#xff09;工程文件结构-CSDN博客 开源 C…

今日科技风向|从AI芯片定制到阅兵高科技展示——聚焦技术前沿洞察

今日科技风向&#xff5c;从AI芯片定制到阅兵高科技展示——聚焦技术前沿洞察 一、NVIDIA 开发“黑曜”子版 AI 芯片 B30A&#xff0c;瞄准中国市场 今日报道指出&#xff0c;NVIDIA 正在研发一款面向中国市场的定制芯片 B30A&#xff0c;基于其先进的 Blackwell 架构&#xff…

Elasticsearch官方文档学习-未完待续

Elasticsearch官方文档学习-未完待续说明快速开始基础知识索引组成1. 文档 (Documents)2. 元数据字段(Metadata fields)3. 映射和数据类型(Mappings and data types)文档操作(Document)批量创建或者删除文档 (Bulk index or delete documents)乐观并发控制 Optimistic concurre…

Redis资料

Redis是什么&#xff1f; Redis(Remote Dictionary Server)是一个开源的、基于内存的键值数据库&#xff0c;支持多种数据结构&#xff0c;可用作数据库、缓存和消息中间件。主要特点包括&#xff1a; 基于内存操作&#xff0c;读写性能极高支持持久化&#xff0c;可将内存数…

CAMEL-Task2-Agent的构成组件

CAMEL-Task2-Agent的构成组件 本文笔记主要关于2.7章节&#xff1a;CAMEL框架中agents如何使用工具。 一、工具说明 为什么要额外使用工具&#xff1f; agents本身的知识和能力有限&#xff0c;比如一些问题需要联网搜索才能准确回答&#xff08;而不是乱答&#xff0c;即“…

数据整理自动化 - 让AI成为你的数据助手

文章目录数据整理自动化 - 让AI成为你的数据助手引言&#xff1a;数据整理的时代挑战与机遇1. 常见数据整理场景分析1.1 数据整理的多元场景图谱1.2 数据质量问题的分类与影响1.3 传统处理方法的局限性2. AI与传统脚本的协同工作流2.1 智能数据整理架构设计2.2 协同工作流的最佳…