当前位置: 首页 > news >正文

网络编程day04/05原始套接字

1.原始套接字概述

在网络编程中,套接字(socket)是一种用于实现网络通信的编程接口。原始套接字(Raw

Socket)是一种特殊的套接字类型,与普通的流式套接字和数据报套接字不同,它允许程序直接访问底层的网络协议,而不仅仅是传输层协议(如TCP和UDP)。

原始套接字的主要特点和用途包括:
  • 访问底层协议:可以直接操作 IP 层及以下的协议,例如构造和发送自定义的 IP 数据包、分析网络数据包等。
  • 网络监测和分析:用于实现网络嗅探器(Sniffer),捕获和分析网络中的数据包,了解网络通信的细节。
  • 自定义协议实现:可以实现自定义的网络协议,用于特殊的网络应用场景。

原始套接字是基于【数据链路层】实现。

2.UDP TCP IP协议底层结构

2.1数据打包方式

2.2UDP协议数据包格式

字段长度(位)说明
源端口号16发送方的端口号
目的端口号16接收方的端口号
长度16UDP数据包(包括首部和数据)的长度,以字节为单位。
校验和16用于校验UDP数据包的完整性
struct udphdr {__be16 source; // __be16 ==> unsigned short__be16 dest;__be16 len;__sum16 check; // __sum16 ==> unsigned short
};

2.3TCP协议数据包格式

字段长度说明
源端口号16发送方端口号
目的端口号16接收方端口号
序列号32用于标识数据包在数据流中的位置
确认号32用于确认已收到的数据包
数据偏移4表示TCP首部的长度,以32未(4字节)为单位
保留6保留字段,必须设置为0
控制位6包含多个控制标志,如SYN,ACK,FIN等
窗口大小16表示接收方的接受窗口大小
校验和16用于校验TCP数据包的完整性
紧急指针16用于指针紧急数据的位置
选项可变可选字段,用于提供额外的功能
struct tcphdr {
u_int16_t th_sport; /* 源端口号 */
u_int16_t th_dport; /* 目的端口号 */
tcp_seq th_seq; /* 序列号 */
tcp_seq th_ack; /* 确认号 */
u_int8_t th_offx2; /* 首部长度和保留位 */
u_int8_t th_flags; /* TCP 标志位 */
u_int16_t th_win; /* 窗口大小 */
u_int16_t th_sum; /* 校验和 */
u_int16_t th_urp; /* 紧急指针 */
};

2.4IP协议数据包格式

字段长度说明
版本4指示IP协议的版本,通常为IPv4(值为4)或IPv6(值为6)。
首部长度4表示IP首部的长度,以32位(4字节)为单位。
服务类型8用于指示数据包的优先级和服务类型。
总长度16整个IP数据包(包括首部和数据)的长度,以字节为单位。
标识16用于唯一标识一个IP数据包,主要用于分片和重组。
标志3包含三个标志位,用于控制分片操作。
片偏移13指示该片在原始数据包中的相对位置。
生存时间8限制数据包在网络中的生存时间,每经过一个路由器,TTL值减1,TTL为0时,数据包被丢弃。
协议8指示上层协议的类型,如TCP(值为6),UDP(值为17)等
首部校验和16用于校验IP首部的完整性
源IP地址32发送方的IP地址
目的IP地址32接收方的IP地址
选项可变可选字段,用于提供额外的功能
struct iphdr{
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
#else
#error "Please fix <asm/byteorder.h>"
#endif
__u8 tos;
__be16 tot_len;
__be16 id;
__be16 frag_off;
__u8 ttl;
__u8 protocol;
__sum16 check;
__be32 saddr;
__be32 daddr;
/* 选项从此处开始 */
}

http://www.dtcms.com/a/392255.html

相关文章:

  • Yarn命令与npm命令的区别与联系(npm:Node.js的官方包管理工具;Yarn:Facebook开发的JavaScript包管理工具)
  • 【大语言模型 67】梯度压缩与稀疏通信
  • LeetCode第365题_水壶问题
  • OpenCV:DNN 模块实现图像风格迁移
  • 锤子助手插件功能六十四:禁用视频前置摄像头镜像
  • OpenHarmony NFC Tag驱动深度剖析:从HDF框架到NDEF读写全流程实战
  • 黑马头条_SpringCloud项目阶段四:多媒体短文章提交功能实现详解
  • TraceID串联数据孤岛:勤源全链路可观测性平台破解微服务“黑箱困境”
  • 随机梯度下降(SGD)算法及其在机器学习中的应用
  • 趣谈bug - the Norway problem
  • $attrs 和 $listeners 的使用场景和用法是什么?
  • [Linux]学习笔记系列 -- lib/radix-tree.c 基数树(Radix Tree) 整数键到指针的高效映射
  • Scikit-learn Python机器学习 - 回归分析算法 - 线性回归 (LinearRegression SGDRegressor)
  • ts的内置工具类型
  • 扫地车:守护多元场景的清洁 “多面手”
  • 力扣 136.只出现一次的数字
  • 【序列晋升】38 Spring Data MongoDB 的统一数据访问范式与实践
  • 如何将枯燥的大数据呈现为可视化的图和动画?
  • 前后端分离架构下,如何安全存储和使用 API 密钥?
  • Nano 编辑器快捷键
  • 《智能体教程》——如何构建多智能体系统:开发者实用指南
  • 小杰机器学习高级(three)——逻辑回归、二分类算法
  • Spring注解驱动开发:从XML到注解的完美蜕变
  • 【Spring AI】第三弹:深入解析 RAG 核心特性、关键流程、基于 Spring AI + 知识库实现 RAG 检索增强器
  • 【剪映】官方下载方式?【图文详解】电脑版下载?正版安全下载?最新版下载?
  • 《UE5_C++多人TPS完整教程》学习笔记56 ——《P57 未装备武器的蹲伏(Crouch Unequipped)》
  • AI人工智能训练师五级(初级)考试题库(1)1~100题
  • 【Python精讲 02】编程第一课:彻底掌握Python变量、数字、字符串与布尔值
  • Unity2D-Sprite
  • 本地实现视频分析与总结工具