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

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

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

相关文章

Docker访问文件权限受限问题解决

问题描述 运行项目的docker环境&#xff0c;新添加了一个数据集&#xff0c;但是数据集的访问权限受限&#xff08;Permission dinied&#xff09;&#xff0c;运行的命令如图所示 问题解决 chmod 777 xxx YYDS&#xff01;&#xff01;&#xff01;但是单纯直接运行会因为权限…

vue使用driver.js引导并自定义样式和按钮

参考网址https://driverjs.com/docs/installation 安装 npm install driver.js 以下是1.3.1版本的基本使用方法 import { driver } from driver.js import driver.js/dist/driver.css mounted() {// 实例化driver对象const driverObj driver({showProgress: true,steps: …

LeetCode674:最长连续递增序列

题目描述 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定&#xff0c;如果对于每个 l < i < r&#xff0c;都有 nums[i] < nums…

uniapp微信小程序在ios端返回不显示弹窗的bug解决

这个问题其实是因为返回页面的时候弹的太快了导致的解决办法&#xff1a; 其实就是返回页面的弹窗加个延迟就好啦

iOS单元测试覆盖率报告导出功能实现

一、插件安装 在Mac电脑上&#xff0c;安装slather插件。插件地址&#xff1a;https://github.com/SlatherOrg/slather 安装命令&#xff1a; gem install slather二、在Xcode上设置Code Coverage&#xff0c;Targets指定XXX 三、在终端切换到项目根目录下&#xff0c;执行单…

在Windows上创建RAM Disk

在Windows 10上创建一个与Linux中的tmpfs相似的内存文件系统&#xff08;一个文件系统&#xff0c;它使用主内存作为存储&#xff09;通常不是操作系统直接提供的功能。不过&#xff0c;有一些方法可以实现类似的效果。 使用软件创建RAM Disk 有一些第三方软件可以帮助在Wind…

牛马真的沉默了,入职第一天就干活

入职第一天就干活的&#xff0c;就问还有谁&#xff0c;搬来一台N手电脑&#xff0c;第一分钟开机&#xff0c;第二分钟派活&#xff0c;第三分钟干活&#xff0c;巴适。。。。。。 打开代码发现问题不断 读取配置文件居然读取两个配置文件&#xff0c;一个读一点&#xff0c;…

Java时间工具类(Date和LocalDateTime)

Date package com.qiangesoft.utils.date;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;/*** 日期工具类** author lq* date 2024-05-23*/ public class DateUtil {public static final String[] C…

Docker 安装最新版MongoDB 限制内存 配置权限

目录 一、Dokcer安装命令 二、配置MongoDB管理员 一、Dokcer安装命令 docker pull mongo docker run -m 512M --name mongo -p 27017:27017 -d mongo --auth 这里通过-m来限制mongodb使用内存的大小&#xff0c;可以按需求来设置。 二、配置MongoDB管理员 数据库权限有以…

HiWoo Box边缘计算网关

​在数字化浪潮汹涌的今天&#xff0c;边缘计算网关成为了连接物理世界与数字世界的桥梁&#xff0c;其重要性日益凸显。HiWoo Box&#xff0c;作为一款功能强大的边缘计算网关&#xff0c;不仅具备了传统网关的基本功能&#xff0c;更在数据采集、处理、传输等方面展现出了卓越…

怎么使Ajax设为同步和异步

Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;最初的设计就是异步的&#xff0c;这意味着当发送请求时&#xff0c;浏览器不会等待服务器的响应就会继续执行后续的JavaScript代码。这使得用户界面&#xff08;UI&#xff09;在请求处理时不会冻结&#xff0c;从…

后端开发面试题2(附答案)

前言 在下首语言是golang,所以会用他作为示例。 原文参见 @arialdomartini的: Back-End Developer Interview Questions 开放式问题 1. 为什么人们会抵制变化? 以下列举了一些常见理由: 稳定性与可靠性: 已经投入生产环境的软件经过长时间的测试和使用,证明了其稳定性…

数仓面试100题

1. 简述拉链表&#xff0c;流⽔表以及快照表的含义和特点&#xff1f; 1&#xff09;拉链表 ● 维护历史状态&#xff0c; 以及最新状态数据 适⽤情况&#xff1a; ● 数据量⽐较⼤ ● 表中的部分字段会被更新 ● 需要查看某⼀个时间点或者时间段的历史快照信息 查看某⼀个订单…

automa:循环元素的一个示例,取TME结合插件实现自动下载音乐。

因为tme没提供批量下载音乐的功能。我找到了一个插件可以下载。但需要点击播放时&#xff0c;才能感 知。 我原来用python写了一个&#xff0c;能实现&#xff0c;这想把他移植到automa上&#xff0c;同时想使用循环元素的方法&#xff0c;避免不必要的时间浪费。 开始。首先…

JS事件循环机制(event loop)之宏任务、微任务

js代码在执行的时候&#xff0c;会先执行同步代码&#xff0c;遇到异步宏任务则将异步宏任务放入宏任务队列中&#xff0c;遇到异步微任务则将异步微任务放入微任务队列中&#xff0c;当所有同步代码执行完毕后&#xff0c;再将异步微任务从队列中调入主线程执行&#xff0c;微…

2024年商业管理与文化传播国际学术会议(ICBMCC 2024)

2024年商业管理与文化传播国际学术会议&#xff08;ICBMCC 2024) 2024 International Conference on Business Management and Cultural Communication 一、【会议简介】 2024年商业管理与文化传播国际学术会议&#xff08;ICBMCC 2024&#xff09;是一次汇集全球商业管理领域…

Vaex :突破pandas,快速分析100G大数据量

pandas处理大数据的限制 现在的数据科学比赛提供的数据量越来越大&#xff0c;动不动几十个G&#xff0c;甚至上百G&#xff0c;这就要考验机器性能和数据处理能力。 Python中的pandas是大家常用的数据处理工具&#xff0c;能应付较大数据集&#xff08;千万行级别&#xff09…

深入理解Nginx配置文件:全面指南

Nginx 是一个高性能的 HTTP 服务器和反向代理服务器&#xff0c;也是一个电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。由于其高效性和灵活性&#xff0c;Nginx 被广泛应用于各种 web 服务中。本文将详细介绍 Nginx 配置文件的结构和主要配置项&#xff0c;帮助你深入…

HarmonyOS之ArkUI布局设计常见细节

这里写目录标题 1. Button设置带有渐变色的背景图片无效1.1 问题分析1.2 成功案例 2. 路由跳转失败2.1 问题分析 1. Button设置带有渐变色的背景图片无效 1.1 问题分析 说明&#xff1a;设置颜色渐变需先设置backgroundColor为透明色。 Button($r(app.string.login), { type…

Logrus IT的专家们已将游戏《菇勇者传说》翻译成俄语

《菇勇者传说》是一款引人入胜的放置类RPG游戏&#xff0c;邪恶的龙将所有人变成了蘑菇。为了恢复人类形态&#xff0c;玩家的角色需要从小蘑菇成长为强大的勇士。 游戏中有多个蘑菇职业&#xff0c;每个职业都有独特的技能。玩家可以根据自己的喜好提升角色的属性和改变外观&…