TCP通信流程

TCP通信流程

TCP和UDP的区别
TCP(传输控制协议)
  • 面向连接的:在数据传输之前,TCP 需要三次握手来建立连接。
  • 可靠的传输:通过序列号、确认响应、重传机制、流量控制和拥塞控制来保证数据正确传输。
  • 基于字节流:TCP 把应用层的消息视为一连串无结构的字节流。
  • 支持单播传输:数据只能在单一的发送者和接收者之间传输。
  • 首部开销较大:TCP 头部至少20个字节,包含了许多控制信息,如序列号、确认号、数据偏移、控制位、窗口、校验和等。
  • 适用场景:适合要求高可靠性的应用,如文件传输、电子邮件、网页浏览等。
UDP(用户数据报协议)
  • 面向无连接:发送数据之前不需要建立连接,减少了延时。
  • 不可靠的传输:不提供数据到达确认,没有重传机制,也不进行数据顺序处理或重组。
  • 面向数据报:每个UDP数据包都是独立传输的,包含完整的地址信息。
  • 多种传输方式:支持单播、多播和广播传输。
  • 首部开销较小:UDP头部只有8个字节,包括源端口、目的端口、长度和校验和。
  • 适用场景:适合对传输速度要求高,但对数据完整性要求相对较低的应用,如视频会议、实时游戏、语音传输等。
比较

下表简单总结了TCP和UDP的主要区别:

特性TCPUDP
是否创建连接面向连接的无连接
是否可靠可靠的不可靠
连接的对象个数支持一对一一对一、一对多、多对一、多对多
传输的方式面向字节流面向数据报
首部开销最少20个字节8个字节
适用场景可靠性高的应用(文件传输)实时应用(视频会议,直播)

通过这些特性的对比,可以根据具体的网络应用需求选择适合的传输协议。

image-20240523093737159
TCP的服务端通信流程
  1. 创建一个用于监听的套接字

    • 套接字是一个端点,用于进行网络通信。在服务器端,首先需要创建一个套接字来监听客户端的连接请求。(套接字其实就是一个文件描述符)
  2. 将监听套接字与本地的 IP 地址和端口绑定

    • 服务器的 IP 地址和端口号定义了其在网络上的地址。绑定是将套接字与特定的 IP 地址和端口号关联的过程。
  3. 设置监听

    • 设置套接字为监听模式,监听的fd开始工作, 准备接收来自客户端的连接请求。
  4. 阻塞等待客户端连接

    • 服务器调用 accept 函数,该函数会阻塞服务器直到一个客户端连接到达。当连接建立时,accept 会返回一个新的套接字文件描述符,用于与该客户端进行通信。
  5. 通信

    • 使用得到的文件描述符进行数据的接收和发送。服务器可以根据需要读取客户端发送的数据,并发送响应。
  6. 通信结束,断开连接

    • 通信完成后,服务器关闭连接套接字。

你的描述准确地概述了 TCP 客户端的基本通信流程。这里我会扩展你的说明,提供一个详细的解释,并给出如何在 C 语言中实现一个简单的 TCP 客户端的示例代码。

TCP 客户端通信流程
  1. 创建一个用于通信的套接字

    • 客户端首先需要创建一个套接字,用于和服务器建立连接及后续的数据交换。(不需要绑定IP和端口号,端口号是随机的)
  2. 连接服务器

    • 使用指定的服务器 IP 地址和端口号,客户端通过其套接字发起到服务器的连接请求。
  3. 通信

    • 连接建立成功后,客户端可以通过套接字发送数据到服务器,并接收服务器回传的数据。
  4. 通信结束,断开连接

    • 完成数据交换后,客户端应关闭套接字,结束与服务器的连接。

套接字函数

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> // 包含了这个头文件,上面两个就可以省略
  1. int socket(int domain, int type, int protocol)

    • 功能:创建一个套接字。
    • 参数
      • domain:协议族,如 AF_INET(IPv4),AF_INET6(IPv6),AF_UNIXAF_LOCAL(本地套接字通信)。
      • type:通信类型,如 SOCK_STREAM(流式协议,TCP),SOCK_DGRAM(数据报协议,UDP)。
      • protocol:具体协议,一般写 0 以选择默认协议。比如流式协议不止一种
    • 返回值:成功返回文件描述符,失败返回 -1
  2. int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)

    • 功能:将文件描述符绑定到本地 IP 和端口。
    • 参数
      • sockfd:由 socket 函数返回的文件描述符。
      • addr:需要绑定的地址,包含 IP 和端口信息。
      • addrlen:地址结构的大小。
    • 返回值:成功返回 0,失败返回 -1
  3. int listen(int sockfd, int backlog)

    • 功能:监听套接字上的连接。
    • 参数
      • sockfd:用于监听的文件描述符。
      • backlog:未连接和已连接队列和 的最大长度。
    • 返回值:成功返回 0,失败返回 -1
  4. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)

    • 功能:接收客户端连接。
    • 参数
      • sockfd:监听的文件描述符。
      • addr:存储客户端地址信息。
      • addrlen:地址结构的大小。
    • 返回值:成功返回新的文件描述符,失败返回 -1
  5. int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)

    • 功能:客户端连接到服务器。
    • 参数
      • sockfd:用于通信的文件描述符。
      • addr:服务器的地址信息。
      • addrlen:地址结构的大小。
    • 返回值:成功返回 0,失败返回 -1
  6. write(int fd, const void *buf, size_t count)

    • 功能:向文件描述符写数据。
    • 参数
      • fd:文件描述符。
      • buf:要写的数据缓冲区。
      • count:要写的字节数。
    • 返回值:成功返回写入的字节数,失败返回 -1
  7. read(int fd, void *buf, size_t count)

    • 功能:从文件描述符读数据。
    • 参数
      • fd:文件描述符。
      • buf:存储读数据的缓冲区。
      • count:要读取的字节数。
    • 返回值:成功返回读取的字节数,失败返回 -1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/636086.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis崩溃后,如何进行数据恢复的?no.24

本课时我们主要学习通过 RDB、AOF、混合存储等数据持久化方案来解决如何进行数据恢复的问题。 Redis 持久化是一个将内存数据转储到磁盘的过程。Redis 目前支持 RDB、AOF&#xff0c;以及混合存储三种模式。 RDB Redis 的 RDB 持久化是以快照的方式将内存数据存储到磁盘。在…

MongoDB基础入门到深入(八)MongoDB整合SpringBoot、Chang Streams

文章目录 系列文章索引十五、MongoDB整合SpringBoot1、环境准备2、集合操作3、文档操作&#xff08;1&#xff09;相关注解&#xff08;2&#xff09;创建实体&#xff08;3&#xff09;添加文档&#xff08;4&#xff09;查询文档&#xff08;5&#xff09;更新文档&#xff0…

Science| 单体耦合纤维实现无芯片纺织电子(纤维器件/智能织物/柔性可穿戴电子)

东华大学Hongzhi Wang,Chengyi Hou和Qinghong Zhang团队在《Science》上发布了一篇题为“Single body-coupled fiber enables chipless textile electronics”的论文。论文内容如下: 一、 摘要 智能纺织品为将技术融入日常生活中提供了理想的平台。然而,目前的纺织电子系统…

非关系型数据库NOSQL

文章目录 1. NOSQL 概述2. 相关理论基础2.1 一致性2.2 分区2.3 存储分布2.4 查询模型 3. NOSQL 数据库的种类3.1 文档存储3.2 键值存储3.3 列存储3.3 图存储 4. NOSQL 应用案例和新技术4.1 HBase 数据库4.2 云数据库 GeminiDB 非关系型的数据库 NOSQL (Not Only SQL)是对不同于…

paligemma、Grounding-DINO-1.5简单无需标注无需训练直接可以使用的VLM图像到文本模型

1、paligemma 参考:https://github.com/google-research/big_vision/blob/main/big_vision/configs/proj/paligemma/README.md 模型架构: 文本与图像特征一起送入大模型 在线体验网址: https://huggingface.co/spaces/big-vision/paligemma 通过文字prompt既可与图片对话…

Windows11下使用Qt5.14.2编译QtXlsx驱动详细步骤

原有&#xff1a;由于系统需要将QTableWidget表格中的数据导出、在Windows下最开始使用Excel.Application组件实现了导出功能&#xff0c;后面将代码转换到Ubuntu20.04下进行编译&#xff0c;发现项目.pro文件中的QT axcontainer和代码.h文件中的#include <QAxObject>跟…

运维开发.索引引擎ElasticSearch.倒序索引的概念

运维开发.索引引擎ElasticSearch 倒序索引的概念 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn…

ConCurrentHashMap源码学习

ConCurrentHashMap在JDK7之前是ReentrantLockSegmentHashEntry&#xff0c;在JDK8及之后是synchronizedCASNode红黑树。 JDK7之前 对于JDK7的版本实现&#xff0c;ConcurrentHashMap为了提高本身的并发能力&#xff0c;在内部采用了一个Segment结构&#xff0c;一个Segment其…

路由器不能端口映射什么原因?如何设置内网映射?

近期有小伙伴发来求助信息&#xff0c;他以前开游戏服务器和别人一起玩&#xff0c;那个时候端口映射还好&#xff0c;不知道哪一天开始突然不行了&#xff0c;已经是公网了&#xff0c;光猫是桥接的状态&#xff0c;连路由器都换了&#xff0c;就是不能端口映射开服务器&#…

如何使用Suno:免费的AI歌曲生成器

文章目录 Suno AI 是什么&#xff1f;Suno AI 如何工作&#xff1f;选择Suno AI的理由&#xff1a;核心优势易于操作多样化创作灵活的定价策略版权保障技术突破 如何使用Suno AI创作歌曲&#xff1f;第1步&#xff1a;注册Suno AI账户第2步&#xff1a;输入提示词创建第 3 步&a…

酷开系统 | 酷开科技把握智慧先机 AI赋能家庭场景

智慧化是当今世界科技发展的前沿领域之一。现在的智慧化&#xff0c;也正在逐步成为我们日常生活的一部分。电视系统也进入了数字化时代&#xff0c;AI的应用正在不断扩展&#xff0c;其潜力似乎无穷无尽。 酷开科技深耕人工智能技术&#xff0c;在提升语音体验、强化智能家居…

leetcode230 二叉搜索树中第K小的元素

题目 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 示例 输入&#xff1a;root [5,3,6,2,4,null,null,1], k 3 输出&#xff1a;3 解析 这道题应该是能做出…

小程序丨数据功能如何使用

查询发布完成后&#xff0c;如发现信息有误或想要修改信息&#xff0c;老师可以使用数据功能在线修改已发布的查询内容。 数据功能包含导出、添加、编辑、更多操作&#xff0c;下面来教大家如何使用吧。 &#x1f4cc;使用教程 数据功能主要用于在线修改已发布的查询内容&#…

什么是流量削峰?如何解决秒杀等业务的削峰场景

文章推荐 1 作为程序员&#xff0c;开发用过最好用的AI工具有哪些&#xff1f; 2 Github Copilot正版的激活成功&#xff0c;终于可以chat了 3 idea,pycharm等的ai assistant已成功激活 4 新手如何拿捏 Github Copilot AI助手&#xff0c;帮助你提高写代码效率 5 Jetbrains的a…

软件设计:基于 python 代码快速生成 UML 图

1. 官方文档 PlantUML Language Reference Guide Comate | 百度研发编码助手 百度 Comate (Coding Mate Powered by AI) 是基于文心大模型的智能代码助手&#xff0c;结合百度积累多年的编程现场大数据和外部优秀开源数据&#xff0c;可以生成更符合实际研发场景的优质代码。…

【easyx】快速入门——弹球小游戏(第一代)

目录 1.需求 2.运动的小球 3.碰到边缘反弹 4.圆周撞击或越过边界反弹 5.绘制和移动挡板 6.小球碰到挡板反弹 7.游戏失败时该如何处理 8.随机初始条件 9.完整代码 我们这一节将结合动画和键盘交互的知识来做一个小游戏 1.需求 我们先看需求:小球在窗体内运动,撞到除…

OTP8脚-全自动擦鞋机WTN6020-低成本语音方案

一&#xff0c;产品开发背景 首先&#xff0c;随着人们生活质量的提升&#xff0c;对鞋子的保养需求也日益增加。鞋子作为人们日常穿着的重要组成部分&#xff0c;其清洁度和外观状态直接影响到个人形象和舒适度。因此&#xff0c;一种能够自动清洁和擦亮鞋子的设备应运而生&am…

docker 安装 SonarQube

文章目录 docker 安装 SonarQube一、修改句柄二、创建挂载文件夹三、拉取镜像四、修改 PG 库4.1、创建用户4.2、创建库 五、启动和挂载六、访问七、安装插件 docker 安装 SonarQube 版本&#xff1a;8.9 对 JDK 8 最大支持为 8.9 版本 一、修改句柄 #修改文件句柄数量&#…

Android Studio 版本升级后 Gradle project sync failed(Android V 应用升级)

问题及解决方案 更新到蜥蜴 Android Studio Iguana 后&#xff0c;出现Gradle project sync failed的问题&#xff08;IDE更新版本的常态了&#xff09;。 背景&#xff1a;对应用进行Android V版本升级&#xff08;SDK35&#xff0c;gradle插件版本要 8.4.0&#xff09; 1、…

安卓实现5个底部导航栏切换fragment

步骤&#xff0c;写 5 个 fragment 自定义的类5个布局文件&#xff1a; package com.xmkjsoft.xhgh.fragment;import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;import androidx.annotation.NonNul…