news 2026/7/15 1:20:03

自学嵌入式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/7/8 9:41:46

x64与arm64外设驱动模型对比:图解说明

x64与arm64外设驱动模型对比:从硬件到代码的实战解析你有没有遇到过这样的情况?同一份Linux内核,编译后在x64服务器上跑得好好的网卡驱动,放到一块ARM开发板上却连设备都识别不了。不是代码有问题,也不是编译器出错——…

作者头像 李华
网站建设 2026/7/14 20:53:04

GPT-SoVITS是否支持语音指令触发?

GPT-SoVITS 是否支持语音指令触发? 在智能语音助手、虚拟人和个性化音频内容爆发的今天,越来越多开发者和用户开始关注:能不能用一句话唤醒一个AI声音,并让它以“我爸爸”或“我喜欢的主播”的音色来朗读内容? 这个问题…

作者头像 李华
网站建设 2026/7/9 14:14:28

终极指南:3分钟搞定QQ空间历史数据永久备份

终极指南:3分钟搞定QQ空间历史数据永久备份 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心那些记录青春岁月的QQ空间说说不小心丢失?😱 那…

作者头像 李华
网站建设 2026/7/14 19:11:39

GPT-SoVITS语音连读规则遵循程度评测

GPT-SoVITS语音连读规则遵循程度评测 在当前AIGC浪潮席卷内容创作领域的背景下,个性化语音合成正从实验室走向千行百业。无论是为动画角色配音、打造专属有声书朗读音色,还是构建拟人化智能助手,用户对“像真人说话”的语音质量提出了前所未有…

作者头像 李华
网站建设 2026/7/14 8:29:23

AHN:让Qwen2.5高效处理超长文本的新突破

字节跳动推出的Artificial Hippocampus Networks(AHN)技术,成功解决了大语言模型在处理超长文本时面临的效率与记忆难题,为Qwen2.5系列模型带来了显著的长上下文处理能力提升。 【免费下载链接】AHN-DN-for-Qwen-2.5-Instruct-14B…

作者头像 李华
网站建设 2026/7/14 11:40:13

Multisim平台数据库链接建立快速理解

如何让Multisim“活”起来?——手把手教你打通数据库链接,实现元件库智能管理你有没有遇到过这种情况:一个项目里用了几十个电阻电容,每个都要手动输入标称值、封装和型号?新来的同事用的还是三年前的老版模型&#xf…

作者头像 李华