news 2026/6/10 13:28:44

自学嵌入式day38天,tcp

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
自学嵌入式day38天,tcp
1. TCP传输控制协议概述

TCP(传输控制协议)是一种用于在网络中可靠传输数据的协议。它基于服务器客户端模型工作,常见的模型包括:

  • CS(Client-Server)模型:客户端和服务器角色分明,客户端向服务器请求服务。
  • BS(Browser-Server)模型:浏览器作为通用客户端,服务器提供服务。
  • P2P(Peer-to-Peer)模型:节点之间对等通信,每个节点既是客户端又是服务器。

这些模型的区别如下:

  • CS模型:使用专用客户端,应用层协议可自定义,功能相对复杂,资源(如数据)存储在本地。
  • BS模型:使用通用客户端(浏览器),应用层协议固定为HTTP,功能相对简单,资源由服务器发送给客户端。
  • P2P模型:常用于网络下载工具。例如,初始下载进度为0%时,其他客户端或服务器提供数据;当进度达90%时,自身也为新客户端上传数据,实现同时下载和上传。
2. TCP的主要特征:
  • 有连接:通过三次握手建立连接,连接建立后保持直到一方断开(四次挥手)。
  • 可靠传输:通过应答(ACK)、超时重传等机制确保数据完整。但实时性较弱,网络资源消耗较大。
  • 流式套接字:数据无边界,连续有序。
  • 全双工:支持双向通信,使用双缓存区。
  • 发送与接收次数不匹配:发送次数和接收次数不需要对应。
  • 写阻塞:存在64K的缓冲区限制。
  • 感知断开:一方断开连接时,另一方可通过四次挥手感知。

可靠传输机制包括:

  • 应答(ACK):确认数据接收。
  • 超时重传:未收到应答时重发数据。
  • 实时性弱:不适合高实时性应用。
  • 资源消耗大:相比UDP,占用更多网络资源。
3. TCP相关函数详解
创建套接字:socket()

用于创建套接字描述符。

int socket(int domain, int type, int protocol);
  • 功能:向内核申请创建套接字描述符。
  • 参数
    • domain:地址族,如PF_INET(互联网程序)或PF_UNIX(单机程序)。
    • type:套接字类型,如SOCK_STREAM(TCP流式套接字)、SOCK_DGRAM(UDP数据报套接字)、SOCK_RAW(原始套接字)。
    • protocol:协议,设为0表示自动适应应用层协议。
  • 返回值:成功返回套接字ID,失败返回-1。
绑定地址:bind()

用于服务器绑定地址。

int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
  • 功能:将套接字ID与指定地址关联,用于接收数据。
  • 参数
    • sockfd:套接字ID。
    • my_addr:地址结构指针。
    • addrlen:地址长度。
  • 返回值:成功返回0,失败返回-1。
监听连接:listen()

用于服务器监听连接请求。

int listen(int sockfd, int backlog);
  • 功能:在套接字ID上监听连接。
  • 参数
    • sockfd:套接字ID。
    • backlog:允许三次握手的排队数。
  • 返回值:成功返回0,失败返回-1。
接受连接:accept()

用于服务器接受客户端连接。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • 功能:从监听队列中取出有效客户端连接。
  • 参数
    • sockfd:套接字ID。
    • addr:客户端地址结构指针,可设为NULL忽略地址信息。
    • addrlen:地址长度指针,需设置为sizeof(struct sockaddr)
  • 返回值:成功返回新通信套接字ID,失败返回-1。
接收数据:recv()

用于接收数据。

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  • 功能:从套接字接收数据到缓冲区。
  • 参数
    • sockfd:通信套接字ID(服务器为accept()返回的ID,客户端为socket()返回的ID)。
    • buf:存储数据的缓冲区。
    • len:要接收的数据长度。
    • flags:接收方式,0表示阻塞接收。
  • 返回值:成功返回接收数据长度(≤len),失败返回-1。
发送数据:send()

用于发送数据。

int send(int sockfd, const void *msg, size_t len, int flags);
  • 功能:从缓冲区发送数据到套接字。
  • 参数
    • sockfd:通信套接字ID(同上)。
    • msg:要发送的数据指针。
    • len:要发送的数据长度。
    • flags:发送方式。
  • 返回值:成功返回发送数据长度,失败返回-1。
连接服务器:connect()

用于客户端连接服务器。

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • 功能:向目标主机发起连接请求。
  • 参数
    • sockfd:本地套接字ID。
    • addr:目标主机地址结构指针。
    • addrlen:地址长度。
  • 返回值:成功返回0,失败返回-1。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 17:51:31

RimWorld模组管理终极指南:告别加载混乱,一键搞定所有依赖

RimWorld模组管理终极指南:告别加载混乱,一键搞定所有依赖 【免费下载链接】RimSort 项目地址: https://gitcode.com/gh_mirrors/ri/RimSort 还在为RimWorld模组加载顺序头疼吗?每次启动游戏都要面对无尽的崩溃和冲突警告&#xff1f…

作者头像 李华
网站建设 2026/6/5 18:43:21

DriverStore Explorer深度指南:Windows驱动存储的终极管理方案

DriverStore Explorer深度指南:Windows驱动存储的终极管理方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 想要彻底优化Windows系统性能?DriverStore…

作者头像 李华
网站建设 2026/5/29 17:16:17

GPT-SoVITS能否实现情绪化语音输出?

GPT-SoVITS能否实现情绪化语音输出? 在虚拟主播深夜直播带货、AI助手温柔提醒你吃药的今天,我们对“声音”的期待早已超越了清晰发音。人们不再满足于一个字正腔圆却毫无波澜的机械朗读,而是渴望听到带有喜悦、愤怒、悲伤甚至疲惫感的“有温度…

作者头像 李华
网站建设 2026/6/10 9:41:09

ncmdumpGUI音频解密转换器:从入门到精通的全方位使用指南

还在为网易云音乐的NCM格式文件无法在其他设备播放而烦恼吗?ncmdumpGUI作为一款专业的音频格式转换工具,能够轻松解密加密的NCM文件,让你真正拥有自己购买的音乐。这款基于C#开发的Windows图形界面工具操作便捷,转换后的音频文件不…

作者头像 李华
网站建设 2026/6/10 10:35:52

3步快速解决显卡驱动冲突:DDU完整清理指南

3步快速解决显卡驱动冲突:DDU完整清理指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller Displa…

作者头像 李华
网站建设 2026/6/8 1:35:10

ncmdumpGUI音乐解锁工具终极指南:5分钟快速上手

还在为网易云音乐的NCM加密格式而烦恼吗?当你发现精心收藏的音乐无法在其他设备上播放时,那种失落感我们深有体会。ncmdumpGUI作为一款专业的音乐解锁工具,专门解决NCM解密和音频格式转换的难题,让你真正拥有自己购买的音乐。 【免…

作者头像 李华