news 2026/3/13 12:46:05

自学嵌入式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/3/12 15:52:44

工业自动化仿真入门必看:Proteus元件库基础配置

工业自动化仿真入门必看:Proteus元件库配置全解析你有没有遇到过这种情况?满心欢喜地打开Proteus,准备搭建一个基于单片机的温度控制系统,结果在搜索栏输入“DS18B20”——什么也没出来。再试“继电器”,跳出来的却是一…

作者头像 李华
网站建设 2026/2/10 23:49:03

RS485接口与MAX485芯片匹配接线的项目实例

从零搞定RS485通信:MAX485接线实战与避坑指南 你有没有遇到过这样的场景? 系统明明在实验室测试得好好的,一拉到现场就丢包、乱码、偶尔死机。查了一圈代码没问题,电源也稳定——最后发现, 罪魁祸首竟是那根不起眼的…

作者头像 李华
网站建设 2026/3/12 9:21:12

RimWorld模组管理新革命:告别崩溃困扰的终极解决方案

RimWorld模组管理新革命:告别崩溃困扰的终极解决方案 【免费下载链接】RimSort 项目地址: https://gitcode.com/gh_mirrors/ri/RimSort 还在为RimWorld模组加载顺序头疼吗?每次添加新模组都要手动调整几十个依赖关系,稍有不慎就游戏崩…

作者头像 李华
网站建设 2026/3/13 4:13:51

AlwaysOnTop:3分钟学会让任意窗口置顶的Windows神器

AlwaysOnTop:3分钟学会让任意窗口置顶的Windows神器 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 你是否曾经遇到过这样的情况:正在视频会议中讲解PPT&…

作者头像 李华
网站建设 2026/3/13 6:15:51

BBDown终极教程:从零开始掌握B站视频下载神器

BBDown终极教程:从零开始掌握B站视频下载神器 【免费下载链接】BBDown Bilibili Downloader. 一款命令行式哔哩哔哩下载器. 项目地址: https://gitcode.com/gh_mirrors/bb/BBDown 还在为B站视频无法离线保存而烦恼吗?BBDown这款强大的命令行工具可…

作者头像 李华
网站建设 2026/3/4 2:59:18

Mac微信防撤回工具完整安装与使用指南

Mac微信防撤回工具完整安装与使用指南 【免费下载链接】WeChatIntercept 微信防撤回插件,一键安装,仅MAC可用,支持v3.7.0微信 项目地址: https://gitcode.com/gh_mirrors/we/WeChatIntercept 在日常微信沟通中,你是否经常遇…

作者头像 李华