
学习感悟最近学完 Linux 下 TCP 以及 HTTP 网络编程部分对比前面 UDP 通信最大感受就是 TCP 虽然可靠性高但内部机制复杂坑点也更多。UDP 只管发出去就结束而 TCP 要处理连接建立断开、丢包重传、流量控制还会出现粘包这种容易踩坑的问题。1.TCP 协议传输层TCP: 传输控制协议 (流式套接字)1. TCP 特点有连接面向字节流安全可靠的传输协议三次握手四次挥手应答机制超时重传机制.... 等机制复杂实时性和效率没有 UDP 高应用场景HTTPSMQTTFTP2. TCP 的三次握手和四次挥手机制三次握手TCP 建立连接时通过三次握手来确保通信双方都已经准备就绪。三次握手由客户端发起。数据收发四次挥手TCP 断开连接时通过四次挥手确保通信双方数据都已经收发结束。3. TCP 编程客户端流程socket()--connect()--send()--recv()--close()服务端流程socket()--bind()--listen()--accept()--recv()--send()--close()connectint connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);功能请求建立连接参数sockfd套接字addr服务端的地址addrlen地址长度返回值成功0失败-1listenint listen(int sockfd, int backlog);功能监听客户端的三次握手参数sockfd监听套接字backlog最多允许监听的客户端的个数返回值成功0失败-1acceptint accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);功能接收完成三次握手的客户端并返回一个通讯套接字参数sockfd监听套接字addr保存接入的客户端的地址信息的指针addrlen地址信息长度的指针返回值成功通讯套接字失败-1recvssize_t recv(int sockfd, void *buf, size_t len, int flags);功能接收网络数据参数sockfd通讯套接字buf存放接收到的数据的空间首地址len期待接收到的字节数flags0 默认方式返回值成功返回实际收到的字节数失败-1返回 0 代表对方发送断开连接4. TCP 报文头部标志位TCP 报文头部数据位SYN请求建立连接标志位ACK效应报文标志位PSH携带数据的报文标志位FIN请求断开连接标志位URG紧急数据标志位RST重置标志位5. TCP 机制三次握手机制建立连接确认双方收发能力正常四次挥手机制断开连接保证双方数据全部处理完毕应答机制TCP 为发送的数据进行编号发送数据时报文头部的序列号是这包数据的第一个数据的编号将来接收方需要给这包数据发送 ACKACK 报文中确认号是收到的最后一个字节编号 1超时重传机制TCP 每发送一包数据后都要等待应答如果超时时间之内没有收到应答则重新发送这包数据。滑动窗口机制缓冲区保存已发送并收到应答的数据、已发送未收到应答的数据、未发送但在对方处理范围内的数据。延迟应答机制TCP 可以发送多组数据发送的同时等待应答。流量控制机制TCP 会根据发送端的数据处理和接收能力调整自己的发送速率根据 ACK 中窗口值的大小进行动态调整流量。捎带应答机制ACK 可以和应用层发送的数据一起发出表示对上包数据的响应。6. TCP 粘包粘包发送端发送速度太快接收端处理速度比较慢导致数据在缓冲区缓存应用层读出数据时多包数据发生了粘连。如何解决收发指定大小数据 (收发结构体)注意跨平台发送时平台的位数。struct data { xxx; long num; }; send(sockfd, data, sizeof(struct data), 0); recv(sockfd, data, sizeof(struct data), 0);给发送的数据明显的分割符应用层根据分隔符解析例hello\n、world\n接收端按换行符分割解析。以自定义方式定义发送的数据帧格式接收方严格按照协议方式解析帧格式示例帧头 数据长度 消息类型 校验 帧尾示例5A 0101 1010 A5校验可选8 位和校验、16 位和校验、CRC 校验。2.HTTP 协议应用层HTTP 协议超文本传输协议基于传输层 TCP 协议端口 80HTTPSSSL 加密方式默认端口 4431. HTTP 协议工作流程建立 TCP 连接发送 HTTP 请求报文URL 正文返回 HTTP 响应报文 正文断开 TCP 连接2. HTTP 报文HTTP 有两类报文请求报文从客户向服务器发送请求报文响应报文从服务器到客户的回答HTTP 报文每一个字段都是 ASCII 码串字段长度不确定。http 请求报文示例GET / HTTP/1.1\r\n Host: news.sohu.com\r\n User‑Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0\r\n Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,*/*;q0.8 Accept‑Language: en‑US,en;q0.5\r\n Connection: keep‑alive\r\n \r\nkeep‑alive长连接HTTP 通信结束保持一段时间连接再断开close短连接HTTP 通信结束立马断开连接HTTP 响应报文示例HTTP/1.1 200 OK\r\n Date: Wed, 02 Sep 2026 06:31:29 GMT\r\n Content‑Type: text/html;charsetutf‑8\r\n Server: openresty Vary: Accept‑Encoding Vary: Origin Vary: Accept‑Request‑Method Vary: Access‑Control‑Request‑Headers Set‑Cookie: SUV1788330689823odinzX9W; Path/; Domainsohu.com; Max‑Age946080000; ExpiresFri, 25 Aug 2056 06:31:29 GMT; Secure; SameSiteNone Trace‑Id: a067a38f132249f8a173162c956fc468.88701.17883306898232510 Data‑Source: X‑Content‑Type‑Options: nosniff X‑XSS‑Protection: 0 S‑REQ‑ID: 12342245799539308391 S‑REQ‑TYPE: 0 X‑Cache‑Lookup: Cache Miss Content‑Encoding: gzip Cache‑Control: no‑cache Transfer‑Encoding: chunked X‑NWS‑LOG‑UUID: 12342245799539308391\r\n Connection: keep‑alive\r\n X‑Cache‑Lookup: Cache Miss\r\n \r\n !DOCTYPE htmlhtml langzh‑CNhead scriptif(windowwindow.performancetypeof window.performance.nowfunction){3.HTTP 常用方法方法 (操作)意义GET获取资源POST提交数据PUT在指明的 URL 下存储一个文档DELETE删除资源4.HTTP 状态码状态码都是三位数字分为 5 大类1xx通知信息请求收到正在进行处理2xx成功请求正常处理3xx重定向需要进一步操作完成请求4xx客户端差错请求语法错误 / 资源不存在5xx服务器差错服务器内部异常常见状态码200 OK请求成功202 Accepted接受请求400 Bad Request错误的请求404 Not Found找不到资源5.http 接口调用示例plaintexthttp://api.k780.com/?appweather.todaycityNm西安appkey10003signb59bc3ef6191eb9f747dd4e83c99f2a4formatjsonappkey平台分配密钥sign签名校验formatjson返回 json 格式数据学习小结TCP 是面向连接可靠字节流协议核心机制三次握手、四次挥手、应答、超时重传、流量控制、滑动窗口TCP 粘包是缓冲区现象不是 bug三种主流解决方案固定结构体、分隔符、自定义帧协议HTTP 基于 TCP文本格式报文区分长短连接状态码区分请求结果实际开发嵌入式 Linux 网络编程TCP 粘包是高频踩坑点写代码的时候必须提前规划数据协议