Linux——网络(tcp)
文章目录
目录
文章目录
前言
一、TCP逻辑
1. 面向连接
三次握手(建立连接)
四次挥手(关闭连接)
2. 可靠性
3. 流量控制
4. 拥塞控制
5. 基于字节流
6. 全双工通信
7. 状态机
8. TCP头部结构
9. TCP的应用场景
二、编写tcp代码函数
1. Socket 创建与配置
socket()
setsockopt()
2. 绑定与监听
bind()
listen()
3. 连接与接受连接
connect()
accept()
4. 数据发送与接收
send()
recv()
5. 关闭连接
close()
shutdown()
6. 地址转换与解析
inet_pton()
inet_ntop()
7. 错误处理
perror()
strerror()
三、基本客服端和服务端
1、服务端
2、客户端
总结
前言
Linux——网络基础(1)-CSDN博客
Linux——网络(udp)-CSDN博客
-
TCP协议概述:简要介绍TCP协议的基本特性,包括连接建立、数据传输、流量控制、拥塞控制等。
-
Linux网络编程基础:介绍Linux下的Socket编程接口,以及如何使用这些接口进行TCP通信。
-
TCP服务器与客户端的实现:通过实际的代码示例,展示如何编写一个简单的TCP服务器和客户端程序。
-
TCP协议的性能优化:探讨如何通过调整TCP参数、使用非阻塞I/O、多线程/多进程等技术来提升TCP应用的性能。
-
常见问题与调试技巧:分享一些在实际开发中可能遇到的TCP相关问题,以及如何使用工具进行网络调试和故障排查。
一、TCP逻辑
1. 面向连接
TCP是一种面向连接的协议,这意味着在数据传输之前,通信双方需要先建立一个连接。连接的建立和关闭是通过三次握手和四次挥手来完成的。
三次握手(建立连接)
-
SYN:客户端向服务器发送一个SYN(同步)报文,表示请求建立连接。
-
SYN-ACK:服务器收到SYN后,回复一个SYN-ACK(同步-确认)报文,表示同意建立连接。
-
ACK:客户端收到SYN-ACK后,发送一个ACK(确认)报文,连接正式建立。
四次挥手(关闭连接)
-
FIN:主动关闭方(客户端或服务器)发送一个FIN(结束)报文,表示希望关闭连接。
-
ACK:被动关闭方收到FIN后,回复一个ACK报文,表示确认收到关闭请求。
-
FIN:被动关闭方完成数据发送后,发送一个FIN报文,表示自己也准备关闭连接。
-
ACK:主动关闭方收到FIN后,回复一个ACK报文,连接正式关闭。
2. 可靠性
TCP通过以下机制确保数据的可靠传输:
-
序列号与确认机制:每个TCP报文都包含一个序列号(Sequence Number),接收方通过发送确认号(Acknowledgment Number)来确认已收到的数据。如果发送方未收到确认,则会重传数据。
-
超时重传:如果发送方在一定时间内未收到确认,则会重新发送数据。
-
数据校验:TCP使用校验和(Checksum)来检测数据在传输过程中是否损坏。
3. 流量控制
TCP通过滑动窗口机制实现流量控制,防止发送方发送数据过快导致接收方缓冲区溢出。
-
接收窗口:接收方通过TCP头部中的窗口字段告知发送方自己当前可接收的数据量。
-
动态调整:接收方可以根据自身缓冲区的可用空间动态调整窗口大小。
4. 拥塞控制
TCP通过拥塞控制算法避免网络拥塞,常见的算法包括:
-
慢启动(Slow Start):初始时发送方以较小的窗口发送数据,随后指数增长。
-
拥塞避免(Congestion Avoidance):当窗口达到阈值后,发送方以线性方式增加窗口大小。
-
快速重传(Fast Retransmit):当发送方收到三个重复的ACK时,立即重传丢失的报文。
-
快速恢复(Fast Recovery):在快速重传后,发送方进入快速恢复阶段,避免窗口大幅减小。
5. 基于字节流
TCP是一种基于字节流的协议,这意味着:
-
无消息边界:TCP将数据视为连续的字节流,不保留发送方写入的数据边界。例如,发送方发送两次数据(“Hello”和“World”),接收方可能一次性收到“HelloWorld”。
-
粘包与拆包:由于TCP的字节流特性,接收方需要自己处理数据的边界问题(如通过长度字段或特殊分隔符)。
6. 全双工通信
TCP支持全双工通信,即通信双方可以同时发送和接收数据。每个TCP连接由两个独立的流组成:
-
一个流用于从客户端到服务器的数据传输。
-
另一个流用于从服务器到客户端的数据传输。
7. 状态机
TCP连接的生命周期由一个状态机管理,常见的状态包括:
-
LISTEN:服务器等待客户端连接。
-
SYN_SENT:客户端已发送SYN,等待服务器响应。
-
SYN_RECEIVED:服务器已收到SYN并发送SYN-ACK,等待客户端确认。
-
ESTABLISHED:连接已建立,可以传输数据。
-
FIN_WAIT_1 / FIN_WAIT_2:主动关闭方等待对方的FIN或ACK。
-
CLOSE_WAIT:被动关闭方等待应用程序关闭连接。
-
TIME_WAIT:连接关闭后,等待可能出现的延迟报文。
8. TCP头部结构
TCP头部包含以下关键字段:
-
源端口和目的端口:标识通信的应用程序。
-
序列号和确认号:用于数据排序和确认。
-
标志位:如SYN、ACK、FIN等,用于控制连接状态。
-
窗口大小:用于流量控制。
-
校验和:用于数据完整性校验。
9. TCP的应用场景
TCP适用于需要可靠传输的场景,例如:
-
Web浏览(HTTP/HTTPS)
-
文件传输(FTP)
-
电子邮件(SMTP/POP3/IMAP)
-
远程登录(SSH/Telnet)
二、编写tcp代码函数
1. Socket 创建与配置
socket()
-
功能:创建一个新的套接字(socket),用于网络通信。
-
原型:
int socket(int domain, int type, int protocol);
-
参数:
-
domain
:协议族,如AF_INET
(IPv4)或AF_INET6
(IPv6)。 -
type
:套接字类型,如SOCK_STREAM
(TCP)或SOCK_DGRAM
(UDP)。 -
protocol
:通常为0
,表示默认协议。
-
-
返回值:成功返回套接字文件描述符,失败返回
-1
。
setsockopt()
-
功能:设置套接字选项,如重用地址、调整缓冲区大小等。
-
原型:
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
-
常用选项:
-
SO_REUSEADDR
:允许重用本地地址。 -
SO_RCVBUF
/SO_SNDBUF
:调整接收/发送缓冲区大小。
-
2. 绑定与监听
bind()
-
功能:将套接字绑定到本地地址和端口。
-
原型:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
-
参数:
-
sockfd
:套接字文件描述符。 -
addr
:指向struct sockaddr
的指针,包含地址和端口信息。 -
addrlen
:地址结构体的长度。
-
listen()
-
功能:将套接字设置为监听模式,等待客户端连接。
-
原型:
int listen(int sockfd, int backlog);
-
参数:
-
sockfd
:套接字文件描述符。 -
backlog
:等待连接队列的最大长度。
-
3. 连接与接受连接
connect()
-
功能:客户端使用该函数连接到服务器。
-
原型:
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
-
参数:
-
sockfd
:套接字文件描述符。 -
addr
:指向服务器地址结构体的指针。 -
addrlen
:地址结构体的长度。
-
accept()
-
功能:服务器接受客户端的连接请求,返回一个新的套接字用于通信。
-
原型:
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
-
参数:
-
sockfd
:监听套接字文件描述符。 -
addr
:用于存储客户端地址信息。 -
addrlen
:地址结构体的长度。
-
4. 数据发送与接收
send()
-
功能:通过已连接的套接字发送数据。
-
原型:
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
-
参数:
-
sockfd
:套接字文件描述符。 -
buf
:指向要发送数据的缓冲区。 -
len
:数据长度。 -
flags
:标志位,通常为0
。
-
recv()
-
功能:通过已连接的套接字接收数据。
-
原型:
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
-
参数:
-
sockfd
:套接字文件描述符。 -
buf
:指向接收数据的缓冲区。 -
len
:缓冲区长度。 -
flags
:标志位,通常为0
。
-
5. 关闭连接
close()
-
功能:关闭套接字,释放资源。
-
原型:
int close(int sockfd);
-
参数:
-
sockfd
:套接字文件描述符。
-
shutdown()
-
功能:优雅地关闭连接,可以选择关闭读、写或读写通道。
-
原型:
int shutdown(int sockfd, int how);
-
参数:
-
sockfd
:套接字文件描述符。 -
how
:关闭方式,如SHUT_RD
(关闭读)、SHUT_WR
(关闭写)、SHUT_RDWR
(关闭读写)。
-
6. 地址转换与解析
inet_pton()
-
功能:将点分十进制的IP地址转换为二进制格式。
-
原型:
int inet_pton(int af, const char *src, void *dst);
-
参数:
-
af
:地址族,如AF_INET
或AF_INET6
。 -
src
:点分十进制字符串。 -
dst
:存储二进制结果的缓冲区。
-
inet_ntop()
-
功能:将二进制格式的IP地址转换为点分十进制字符串。
-
原型:
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); getaddrinfo()
-
功能:解析主机名和服务名,返回地址信息。
-
原型:
int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
7. 错误处理
perror()
-
功能:打印与
errno
相关的错误信息。 -
原型:
void perror(const char *s);
strerror()
-
功能:将错误码转换为可读的字符串。
-
原型:
char *strerror(int errnum);
三、基本客服端和服务端
1、服务端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 8080
#define BUFFER_SIZE 1024int main() {int server_fd, new_socket;struct sockaddr_in address;int addrlen = sizeof(address);char buffer[BUFFER_SIZE] = {0};char *response = "Hello from server";// 1. 创建套接字if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("Socket failed");exit(EXIT_FAILURE);}// 2. 绑定地址和端口address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY; // 监听所有网络接口address.sin_port = htons(PORT);if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("Bind failed");close(server_fd);exit(EXIT_FAILURE);}// 3. 监听连接if (listen(server_fd, 3) < 0) {perror("Listen failed");close(server_fd);exit(EXIT_FAILURE);}printf("Server listening on port %d...\n", PORT);// 4. 接受客户端连接if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("Accept failed");close(server_fd);exit(EXIT_FAILURE);}// 5. 读取客户端数据int valread = read(new_socket, buffer, BUFFER_SIZE);printf("Client says: %s\n", buffer);// 6. 发送响应给客户端send(new_socket, response, strlen(response), 0);printf("Response sent to client\n");// 7. 关闭连接close(new_socket);close(server_fd);return 0;
}
2、客户端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 8080
#define BUFFER_SIZE 1024int main() {int sock = 0;struct sockaddr_in serv_addr;char buffer[BUFFER_SIZE] = {0};char *message = "Hello from client";// 1. 创建套接字if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("Socket creation failed");exit(EXIT_FAILURE);}serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(PORT);// 2. 将IP地址从字符串转换为二进制格式if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {perror("Invalid address/ Address not supported");close(sock);exit(EXIT_FAILURE);}// 3. 连接到服务器if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {perror("Connection failed");close(sock);exit(EXIT_FAILURE);}// 4. 发送数据到服务器send(sock, message, strlen(message), 0);printf("Message sent to server\n");// 5. 接收服务器的响应int valread = read(sock, buffer, BUFFER_SIZE);printf("Server says: %s\n", buffer);// 6. 关闭连接close(sock);return 0;
}
总结
TCP网络编程是构建高性能、高可靠性网络应用的基础。通过理解TCP协议的工作原理、掌握Linux Socket API的使用方法,并实践编写客户端和服务器程序,我们可以逐步掌握网络编程的核心技能。希望本篇博客能为你的学习之旅提供帮助,期待你在网络编程的世界中探索更多可能性!
相关文章:

Linux——网络(tcp)
文章目录 目录 文章目录 前言 一、TCP逻辑 1. 面向连接 三次握手(建立连接) 四次挥手(关闭连接) 2. 可靠性 3. 流量控制 4. 拥塞控制 5. 基于字节流 6. 全双工通信 7. 状态机 8. TCP头部结构 9. TCP的应用场景 二、编写tcp代码函数…...

腾讯云开发提供免费GPU服务
https://ide.cloud.tencent.com/dashboard/web 适用于推理场景,每个月10000分钟免费时长 166 小时 40 分钟 自带学术加速,速度还是不错的 白嫖 Tesla T4 16G 算力 显存:16GB 算力:8 TFlops SP CPU:8 核 内存&#…...

详解python的修饰符
Python 中的修饰符(Decorator)是一种用于修改或扩展函数或类行为的工具。它们本质上是一个函数,接受另一个函数或类作为参数,并返回一个新的函数或类。修饰符通常用于在不修改原函数或类代码的情况下,添加额外的功能。…...

《攻克语言密码:教AI理解隐喻与象征》
在自然语言处理(NLP)领域,让计算机理解人类语言中的隐喻和象征,是迈向更高语言理解水平的关键一步。从“时间就是金钱”这样的概念隐喻,到文学作品里象征着坚韧的“寒梅”,这些非字面意义的表达方式承载着丰…...

如何解除TikTok地区限制:实用方法解析
随着社交媒体的不断发展,TikTok作为一款短视频平台,已经在全球范围内吸引了数以亿计的用户。然而,不同地区对TikTok的使用权限存在一定的限制,这使得一些用户无法享受平台提供的完整内容和功能。 一、了解TikTok地区限制的原因 在…...

神经网络|(七)概率论基础知识-贝叶斯公式
【1】引言 前序我们已经了解了一些基础知识。 古典概型:有限个元素参与抽样,每个元素被抽样的概率相等。 条件概率:在某条件已经达成的前提下,新事件发生的概率。实际计算的时候,应注意区分,如果是计算综…...

《DeepSeek 网页/API 性能异常(DeepSeek Web/API Degraded Performance):网络安全日志》
DeepSeek 网页/API 性能异常(DeepSeek Web/API Degraded Performance)订阅 已识别 - 已识别问题,并且正在实施修复。 1月 29, 2025 - 20:57 CST 更新 - 我们将继续监控任何其他问题。 1月 28, 2025 - 22&am…...

使用Edu邮箱申请一年免费的.me域名
所需材料:公立Edu教育邮箱一枚(P.S:该服务不支持所有的Edu教育邮箱,仅支持比较知名的院校) 说到域名,.me这个后缀可谓是个性十足,适合个人网站、博客等。.me是黑山的国家顶级域名(c…...

【MCU】DFU、IAP、OTA
我发现很多人把几个概念都学混了,只记得一个升级了 DFU DFU (device firmware update)是指的 USB DFU,这个是 USB 的一个机制,可以升级设备的固件,可以去 USB-IF 查看规范文件。 OTA 全称为 Over-the-air update,利…...

2025.1.21——六、BUU XSS COURSE 1 XSS漏洞|XSS平台搭建
题目来源:buuctf BUU XSS COURSE 1 目录 一、打开靶机,整理信息 二、解题思路 step 1:输入框尝试一下 step 2:开始xss注入 step 3:搭建平台 step 4:利用管理员cookie访问地址 三、小结 二编&#…...

跟李沐学AI:视频生成类论文精读(Movie Gen、HunyuanVideo)
Movie Gen:A Cast of Media Foundation Models 简介 Movie Gen是Meta公司提出的一系列内容生成模型,包含了 3.2.1 预训练数据 Movie Gen采用大约 100M 的视频-文本对和 1B 的图片-文本对进行预训练。 图片-文本对的预训练流程与Meta提出的 Emu: Enh…...

7.抽象工厂(Abstract Factory)
抽象工厂与工厂方法极其类似,都是绕开new的,但是有些许不同。 动机 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。 假设案例 假设…...

python-leetcode-路径总和
112. 路径总和 - 力扣(LeetCode) # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:de…...

WGCLOUD使用介绍 - 如何监控ActiveMQ和RabbitMQ
根据WGCLOUD官网的信息,目前没有针对ActiveMQ和RabbitMQ这两个组件专门做适配 不过可以使用WGCLOUD已经具备的通用监测模块:进程监测、端口监测或者日志监测、接口监测 来对这两个组件进行监控...

智能汽车网络安全威胁报告
近年来随着智能汽车技术的快速发展,针对智能汽车的攻击也逐渐从传统的针对单一车辆控制器的攻击转变为针对整车智能化服务的攻击,包括但不限于对远程控制应用程序的操控、云服务的渗透、智能座舱系统的破解以及对第三方应用和智能服务的攻击。随着WP.29 …...

WPS怎么使用latex公式?
1、下载并安装mathtype https://blog.csdn.net/weixin_43135178/article/details/125143654?sharetypeblogdetail&sharerId125143654&sharereferPC&sharesourceweixin_43135178&spm1011.2480.3001.8118 2、将mathtype嵌入在WPS MathType面板嵌入器,免费工具…...

Cyber Security 101-Build Your Cyber Security Career-Security Principles(安全原则)
了解安全三元组以及常见的安全模型和原则。 任务1:介绍 安全已成为一个流行词;每家公司都想声称其产品或服务是安全的。但事实真的如此吗? 在我们开始讨论不同的安全原则之前,了解我们正在保护资产的对手至关重要。您是否试图阻止蹒跚学步…...

Formality:时序变换(二)(不可读寄存器移除)
相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 一、引言 时序变换在Design Compiler的首次综合和增量综合中都可能发生,它们包括:时钟门控(Clock Gating)、寄存器合并(Register Merging)、…...

MathType下载与安装详细教程
MathType 软件简介安装步骤重新嵌入word 软件简介 数学公式编辑器MathType 是一款专业的数学公式编辑工具,理科生专用的工具。MathType公式编辑器能够帮助用户在各种文档中插入复杂的数学公式和符号。数学公式编辑器工具可以轻松输入各种复杂的公式和符号ÿ…...

docker中运行的MySQL怎么修改密码
1,进入MySQL容器 docker exec -it 容器名 bash 我运行了 docker ps命令查看。正在运行的容器名称。可以看到MySQL的我起名为db docker exec -it db bash 这样就成功的进入到容器中了。 2,登录MySQL中 mysql -u 用户名 -p 回车 密码 mysql -u root -p roo…...

内外网文件摆渡企业常见应用场景和对应方案
在如今的企业环境中,内外网文件摆渡的需求越来越常见,也变得越来越重要。随着信息化的不断推进,企业内部和外部之间的数据交换越来越频繁,如何安全、高效地进行文件传输成了一个关键问题。今天,咱就来聊聊内外网文件摆…...

【Block总结】PKI 模块,无膨胀多尺度卷积,增强特征提取的能力|即插即用
论文信息 标题: Poly Kernel Inception Network for Remote Sensing Detection 作者: Xinhao Cai, Qiuxia Lai, Yuwei Wang, Wenguan Wang, Zeren Sun, Yazhou Yao 论文链接:https://arxiv.org/pdf/2403.06258 代码链接:https://github.com/NUST-Mac…...

自制一个入门STM32 四足机器人具体开发顺序
0 前期准备 1. 知识储备 学习 STM32 微控制器的基础知识,包括 GPIO、定时器、串口通信等外设的使用,可通过官方文档、教程和视频课程进行学习。了解舵机控制原理,因为四足机器人通常使用舵机来实现关节运动。掌握基本的机械结构设计知识&am…...

物联网智能项目之——智能家居项目的实现!
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于物联网智能项目之——智能家居项目…...

[免费]微信小程序智能商城系统(uniapp+Springboot后端+vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序智能商城系统(uniappSpringboot后端vue管理端),分享下哈。 项目视频演示 【免费】微信小程序智能商城系统(uniappSpringboot后端vue管理端) Java毕业设计_哔哩哔哩_bilibili 项目介绍…...

C28.【C++ Cont】顺序表的实现
🧨🧨🧨🧨🧨🧨🧨🧨🧨初二篇🧨🧨🧨🧨🧨🧨🧨🧨🧨 目录 1.知识回顾…...

【电工基础】低压电器元件,低压断路器(空开QF),接触器(KM)
一.低压电器元件定义 电器可分为高压电器和低压电器两大类,我国现行标准是将工作在交流1200V(50Hz)以下、直流1500V以下的电器设备称为低压电器。 二.低压断路器,空开,空气断路器 1.空开图片与使用方式 当电路中发生严重过载、短路及失压等故…...

从 UTC 日期时间字符串获取 Unix 时间戳:C 和 C++ 中的挑战与解决方案
在编程世界里,从 UTC 日期时间字符串获取 Unix 时间戳,看似简单,实则暗藏玄机。你以为输入一个像 “Fri, 17 Jan 2025 06:07:07” 这样的 UTC 时间,然后轻松得到 1737094027(从 1970 年 1 月 1 日 00:00:00 UTC 开始经…...

[前端开发]记录国内快速cdn库,用于在线引入JavaScript第三方库
字节跳动的两个库,官网地址如下,搜索时优先找第一个,可用来链接axios,Boostrap等等第三方库 1. 字节跳动静态资源公共库 比如说搜索lodash,用于节流防抖的库,点击复制即可,一般是****.js或****.min.js这样的为后缀名的链接 点击复制即可, <script src"https://lf9-cd…...

留学生scratch计算机haskell函数ocaml编程ruby语言prolog作业VB
您列出了一系列编程语言和技术,这些可能是您在留学期间需要学习或完成作业的内容。以下是对每个项目的简要说明和它们可能涉及的领域或用途: Scratch: Scratch是一种图形化编程语言,专为儿童和初学者设计,用于教授编程…...