简要分析IPPROTO_TCP参数
一、定义与值
- 头文件:定义在<netinet/in.h>(Linux/Unix)或 <winsock2.h>(Windows)中:
#define IPPROTO_TCP 6 /* TCP 协议 */ - 值:6,对应IANA分配的TCP协议号
- 层级:属于传输层协议(OSI第四层),基于IP协议(网络层)工作
二、核心作用
1. 标识TCP协议
- 在套接字(Socket)编程中,指定使用TCP协议进行数据传输
- 在IP数据包头部中,Protocol字段值为6时,表示负载是TCP数据段
2. 启用TCP特性
| 特性 | 说明 |
| 可靠传输 | 通过确认重传(ACK)、序列号、校验和确保数据不丢失、不重复、有序。 |
| 流量控制 | 滑动窗口机制防止发送方压垮接收方。 |
| 拥塞控制 | 动态调整发送速率(如慢启动、拥塞避免),避免网络拥堵。 |
| 面向连接 | 通信前需通过三次握手建立连接,通信后通过四次挥手释放连接。 |
三、实际应用场景
1. 创建TCP套接字
#include <sys/socket.h>// 创建 TCP 套接字
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - SOCK_STREAM:表示使用流式传输(TCP的典型特征)
- IPPROTO_TCP:显示指定TCP协议(通常可省略,因为SOCK_STREAM已隐含TCP)
2. 设置TCP套接字选项
int enable_keepalive = 1;
setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, &enable_keepalive, sizeof(enable_keepalive)); - TCP_KEEPALIVE :启用保活机制检测连接存活
- TCP_NODELAY:禁用Nagle算法(减少小数据包的延迟)
3. 抓包分析TCP流量
四、TCP数据段格式
TCP数据段的头部结构如下:
| 源端口(Source Port) | 2 | 发送方端口号。 |
| 目标端口(Dest Port) | 2 | 接收方端口号。 |
| 序列号(Sequence Number) | 4 | 数据段的顺序标识。 |
| 确认号(Ack Number) | 4 | 期望接收的下一个序列号(ACK 机制)。 |
| 数据偏移(Data Offset) | 0.5 | TCP 头部的长度(以 4 字节为单位)。 |
| 标志位(Flags) | 0.5~1 | SYN、ACK、FIN、RST 等控制位。 |
| 窗口大小(Window Size) | 2 | 接收方的可用缓冲区大小(流量控制)。 |
| 校验和(Checksum) | 2 | 数据完整性校验。 |
| 紧急指针(Urgent Pointer) | 2 | 紧急数据的偏移量(若 URG 标志置1)。 |
五、常见协议号对比
| 常量 | 值 | 协议 | 特性 |
| IPPROTO_TCP | 6 | TCP | 可靠、面向连接、流量控制。 |
| IPPROTO_UDP | 17 | UDP | 无连接、不可靠、低延迟。 |
| IPPROTO_ICMP | 1 | ICMP | 网络层错误与控制消息(如 ping)。 |
| IPPROTO_ICMPV6 | 58 | ICMPv6 | IPv6 的 ICMP 协议。 |
六、代码示例
1. 创建TCP服务器(C)
#include <sys/socket.h>
#include <netinet/in.h>int main() {// 创建 TCP 套接字int server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(8080);addr.sin_addr.s_addr = INADDR_ANY;// 绑定并监听bind(server_fd, (struct sockaddr *)&addr, sizeof(addr));listen(server_fd, 5);// 接受连接int client_fd = accept(server_fd, NULL, NULL);// ... 数据读写操作 ...return 0;
} 2. 发送TCP数据(Python)
import socket# 创建 TCP 套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("example.com", 80))# 发送 HTTP 请求
sock.send(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
response = sock.recv(4096)
print(response.decode())
sock.close() 七、注意事项
1. 协议号冲突:
- 在原始套接字(Raw Socket)中构造IP数据包时,需将IP头部的Protocol字段设为6,否则接收方无法正确解析TCP数据。
2. NAT与防火墙:
- TCP的端口和连接状态会被NAT设备跟踪,需注意长连接保活
- 防火墙通常根据IPPROTO_TCP和端口号过滤流量(如允许80端口的HTTP)
3. 性能调优:
- 调整TCP缓冲区大小
int buffer_size = 1024 * 1024;
setsockopt(sock, IPPROTO_TCP, SO_RCVBUF, &buffer_size, sizeof(buffer_size));
setsockopt(sock, IPPROTO_TCP, SO_SNDBUF, &buffer_size, sizeof(buffer_size)); - 禁用Nagle算法(需权衡延迟与吞吐量)
int flag = 1;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag)); 八、总结
- 本质:标识TCP协议的常量(协议号=6)
- 用途:
- 在传输层启用TCP的可靠传输机制
- 在套接字编程中显式指定TCP协议
- 关键特性:面向连接、可靠传输、流量与拥塞控制
- 适用场景:需要高可靠性的应用(如web、文件传输、数据库访问)
相关文章:
简要分析IPPROTO_TCP参数
IPPROTO_TCP是操作系统或网络编程中定义的一个 协议号常量,用于标识 传输控制协议(TCP)。其核心作用是 在传输层指定使用TCP协议,确保数据通过TCP的可靠传输机制进行通信。 一、定义与值 头文件:定义在<netinet/in.…...
SOFABoot-06-健康检查
前言 大家好,我是老马。 sofastack 其实出来很久了,第一次应该是在 2022 年左右开始关注,但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概览 SOFABoot-01-蚂蚁金服开源的 s…...
如何理解java中Stream流?
在Java中,Stream 是 Java 8 引入的一个强大API,用于处理集合(如 List、Set、Map 等)数据的流式操作。它提供了一种声明式、函数式的编程风格,可以高效地进行过滤、映射、排序、聚合等操作。 Stream 的核心概念 流&…...
Android使用RxHttp进行国密4加密解密
国密SM4加解密问题汇总 前言国密4加解密工具类RxHttp统一加解密处理解密前言 为了网络安全需要对app内请求数据接口使用SM4国密4进行加解密操作,在实施的过程中遇到了些问题 也收获颇丰,特此记录 在线SM4加密测试网址: 点击此进入网址. 国密4加解密工具类 这里我使用的是b…...
【自学笔记】Linux基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Linux 基础知识点总览目录Linux 简介文件和目录结构常用命令文件操作目录操作权限管理文本处理 Shell 脚本基础进程管理用户和组管理网络配置 总结 Linux 基础知识点…...
JavaScript与客户端开发
1、简介 简单的讲,JavaScript是一种脚本语言,为网站提供了一种在客户端运行程序的手段,通过它可以实现客户端数据验证、网页特效等功能。 JavaScript是一种基于对象和事件驱动(不懂啥意思,暂不管它)&…...
基于CNN的FashionMNIST数据集识别5——GoogleNet模型
源码 import torch from torch import nn from torchsummary import summaryclass Inception(nn.Module):def __init__(self, in_channels, c1, c2, c3, c4):super().__init__()self.ReLu nn.ReLU()#路径1self.p1_1 nn.Conv2d(in_channelsin_channels, out_channelsc1, kern…...
JVM垃圾回收笔记01-垃圾回收算法
文章目录 前言1. 如何判断对象可以回收1.1 引用计数法1.2 可达性分析算法查看根对象哪些对象可以作为 GC Root ?对象可以被回收,就代表一定会被回收吗? 1.3 引用类型1.强引用(StrongReference)2.软引用(SoftReference…...
【初探数据结构】树与二叉树
💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习! 👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对数据结构感…...
numpy学习笔记10:arr *= 2向量化操作性能优化
numpy学习笔记10:arr * 2向量化操作性能优化 在 NumPy 中,直接对整个数组进行向量化操作(如 arr * 2)的效率远高于显式循环(如 for i in range(len(arr)): arr[i] * 2)。以下是详细的解释: 1. …...
蓝桥杯备考:二分答案之路标设置
最大距离,找最小空旷指数值,我们是很容易想到用二分的,我们再看看这个答案有没有二段性 是有这么个二段性的,我们只要二分就行了,但是二分的check函数是有点不好想的,我们枚举空旷值的时候,为了…...
回调方法传参汇总
文章目录 0. 引入问题1. 父子组件传值1.1 父传子:props1.2 子传父:$emit1.3 双向绑定:v-model 2. 多个参数传递3. 父组件监听方法传递其他值3.1 $event3.2 箭头方法 4. 子组件传递多个参数,父组件传递本地参数4.1 箭头函数 … 扩…...
在 Linux下使用 Python 3.11 和 FastAPI 搭建带免费证书的 HTTPS 服务器
在当今数字化时代,保障网站数据传输的安全性至关重要。HTTPS 协议通过使用 SSL/TLS 加密技术,能够有效防止数据在传输过程中被窃取或篡改。本教程将详细介绍如何在 Ubuntu 22.04 系统上,使用 Python 3.11 和 FastAPI 框架搭建一个带有免费 SS…...
XSS基础靶场练习
目录 1. 准备靶场 2. PASS 1. Level 1:无过滤 源码: 2. level2:转HTML实体 htmlspecialchars简介: 源码 PASS 3. level3:转HTML深入 源码: PASS 4. level4:过滤<> 源码: PASS: 5. level5:过滤on 源码…...
Redis核心机制(一)
目录 Redis的特性 1.速度快 2.以键值对方式进行存储 3.丰富的功能 4.客户端语言多 5.持久化 6.主从复制 7.高可用和分布式 Redis使用场景 Redis核心机制——持久化 RDB bgsave执行流程 编辑 AOF AOF重写流程 3.混合持久化(RDBAOF) Red…...
QGroupBox取消勾选时不禁用子控件
默认情况下,QGroupBox取消勾选会自动禁用子控件,如下图所示 那么如何实现取消勾选时不禁用子控件呢? 实现很简单,直接上代码了 connect(ui->groupBox, &QGroupBox::toggled, this, [](bool checked){if (checked false){…...
Go语言中package的使用规则《二》
在 Go 语言中,包(Package) 是代码组织和复用的核心单元。以下是其定义、引用规则及使用习惯的详细说明: 一、包的定义规则 目录与包名 一个包对应一个目录(文件夹),目录名通常与包名一致。 包名…...
MyBatis-Plus 自动填充:优雅实现创建/更新时间自动更新!
目录 一、什么是 MyBatis-Plus 自动填充? 🤔二、自动填充的原理 ⚙️三、实际例子:创建时间和更新时间字段自动填充 ⏰四、注意事项 ⚠️五、总结 🎉 🌟我的其他文章也讲解的比较有趣😁,如果喜欢…...
canvas数据标注功能简单实现:矩形、圆形
背景说明 基于UI同学的设计,在市面上找不到刚刚好的数据标注工具,遂决定自行开发。目前需求是实现图片的矩形、圆形标注,并获取标注的坐标信息,使用canvas可以比较方便的实现该功能。 主要功能 选中图形,进行拖动 使…...
Python 魔术方法深度解析:__getattr__ 与 __getattribute__
一、核心概念与差异解析 1. __getattr__ 的定位与特性 触发时机: 当访问对象中 **不存在的属性** 时自动触发,是 Python 属性访问链中的最后一道防线。 核心能力: 动态生成缺失属性实现优雅的错误处理构建链式调用接口(如 R…...
【机器学习】机器学习工程实战-第2章 项目开始前
上一章:第1章 概述 文章目录 2.1 机器学习项目的优先级排序2.1.1 机器学习的影响2.1.2 机器学习的成本 2.2 估计机器学习项目的复杂度2.2.1 未知因素2.2.2 简化问题2.2.3 非线性进展 2.3 确定机器学习项目的目标2.3.1 模型能做什么2.3.2 成功模型的属性 2.4 构建机…...
【UI设计】一些好用的免费图标素材网站
阿里巴巴矢量图标库https://www.iconfont.cn/国内最大的矢量图标库之一,拥有 800 万 图标资源。特色功能包括团队协作、多端适配、定制化编辑等,适合企业级项目、电商设计、中文产品开发等场景。IconParkhttps://iconpark.oceanengine.com/home字节跳动…...
Visual Studio(VS)的 Release 配置中生成程序数据库(PDB)文件
最近工作中的一个测试工具在测试多台设备上使用过程中闪退,存了dump,但因为是release版本,没有pdb,无法根据dump定位代码哪块出了问题,很苦恼,查了下怎么加pdb生成,记录一下。以下是具体的设置步…...
ubuntu 解挂载时提示 “umount: /home/xx/Applications/yy: target is busy.”
问题如题所示,我挂载一个squanfs文件系统到指定目录,当我使用完后,准备解挂载时,提示umount: /home/xx/Applications/yy: target is busy.,具体的如图所示, 这种提示通常是表明这个路径的内容正在被某些进…...
一条不太简单的TEX学习之路
目录 rule raisebox \includegraphics newenviro 、\vspace \stretch \setlength 解释: 总结: 、\linespread newcommand \par 小四 \small simple 、mutiput画网格 解释: 图案解释: xetex pdelatex etc index 报…...
Matplotlib完全指南:数据可视化从入门到实战
目录 引言 一、环境配置与基础概念 1.1 安装Matplotlib 1.2 导入惯例 1.3 两种绘图模式 二、基础图形绘制 2.1 折线图(Line Plot) 2.2 柱状图(Bar Chart) 三、高级图表类型 3.1 散点图(Scatter Plotÿ…...
在大数据开发中ETL是指什么?
hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字经济时代,数据已成为企业最核心的资产。然而,分散在业务系统、日志文件…...
OAuth 2.0认证
文章目录 1. 引言1.1 系列文章说明1.2 OAuth 2.0 的起源与演变1.3 应用场景概览 2. OAuth 2.0 核心概念2.1 角色划分2.2 核心术语解析 3. 四种授权模式详解3.1 授权码模式(Authorization Code Grant)3.1.1 完整流程解析3.1.2 PKCE 扩展(防止授…...
【Linux 下的 bash 无法正常解析, Windows 的 CRLF 换行符问题导致的】
文章目录 报错原因:解决办法:方法一:用 dos2unix 修复方法二:手动转换换行符方法三:VSCode 或其他编辑器手动改 总结 这个错误很常见,原因是你的 wait_for_gpu.sh 脚本 文件格式不对,具体来说…...
Kubernetes的Replica Set和ReplicaController有什么区别
ReplicaSet 和 ReplicationController 是 Kubernetes 中用于管理应用程序副本的两种资源,它们有类似的功能,但 ReplicaSet 是 ReplicationController 的增强版本。 以下是它们的主要区别: 1. 功能的演进 ReplicationController 是 Kubernete…...
