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

linux网络编程7

24.9.24学习目录

  • 一.网络通信过程(续)
    • 1.路由器
  • 二.原始套接字(SOCK_RAW)
    • 1.创建原始套接字
    • 2.数据包解析

一.网络通信过程(续)

1.路由器

路由器是用于连接多个逻辑上分开的网络;
具有判断网络地址和选择IP路径的功能;
工作在网络层,可以实现不同网段的主机之间进行通信,而路由器则是设置为默认网关;

二.原始套接字(SOCK_RAW)

其是一种不同于TCP和UDP使用的套接字,它实现于系统核心;
可以接收本机网卡上所有的数据帧(即数据包),对于监听网络流量和分析网络数据很有作用;
开发人员可发送自己组装的数据包到网络上;
广泛应用于高级网络编程;
网络专家、黑客通常用来编写奇特的网络程序;

原始套接字可以收发:
1.数据包,其包含头部和数据,需要访问其他协议
2.发送的数据需要使用原始套接字的

1.创建原始套接字

(1)创建链路层的原始套接字

//头文件用于使用ETH_P_ALL这个宏
#include <netinet/ether.h>
int socket(PF_PACKET,SOCK_RAW,protocol);

PF_PACKET:也可以使用AF_PACKET参数;
protocol:用于指定可以收发的数据包类型,ETH_P_IP(为IPV4数据包)、ETH_P_ARP(为ARP数据包)、ETH_P_ALL(为所有协议的数据包)

注意:使用原始套接字时,程序需要管理员权限,即在运行时添加sudo即可

2.数据包解析

在TCP/IP中使用一些“协议类型”标记不同的类,如图:
在这里插入图片描述

(1)UDP报头
在这里插入图片描述
源端口号:发送方的端口号
目的端口号:接收方端口号
长度:UDP用户数据报的长度,最小值为8(没有数据只有首部)
校验和:检测UDP用户数据报在传输中是否有错,有错就丢弃

(2)IP报头
在这里插入图片描述
版本:IP协议版本,通信双方版本必须一致
首部长度:单位时32位
服务类型:一般不适用,取值为0
总长度:指首部加上数据的总长度
标识:用来标识主机发送的每一份数据报
标志:
  标志字段中的最低位记为MF,当为1时表示后面还有数据的分片,当为0时表示时数据中的最后一个分片
  标志字段中的中间位置,记为DF,意思为不能分片,当为0时才可以分片
片偏移:用于说明该分片数据为总数据中的位置
生存时间:TTL,为跳数限制,用于限制数据包在路由器中转发的次数,当下降为0时表示丢弃该数据包
协议:指明数据报采用什么协议发送
首部校验和:只用于校验数据报的首部,不包括数据
源地址:发送方的IP地址
目的地址:接收方的IP地址
选项:用于定义一些任选项

(3)以太网格式
在这里插入图片描述
目的地址:目的mac地址
源地址:源mac地址
类型:IP、ARP、RARP数据包
CRC、PAD在组包时可以忽略

(4)TCP报头
在这里插入图片描述
源端口号:发送发端口号
目的端口号:接收发端口号
序列号:本报文中数据的第一个字节的序号
确认序号:期望接收到对方下一个报文中第一个数据字节的序号
首部长度:报文中除去数据的长度
保留:保留今后使用
紧急URG:当为1时,表示该报文有紧急数据,需要尽快传输
确认ACK:当ACK为1时才有效
推送PSH:当为1时,表示在两个应用进程中希望其尽快的接收到对方的响应
复位RST:用于复位相应的TCP连接
同步SYN:只有在三次握手时有效
终止FIN:当为1时,表示数据已经发送完毕,申请释放连接
窗口:指发送本报文段的一方的接收窗口
校验和:校验和字段校验的范围包括首部和数据两部分
紧急指针:当URG为1时才有效
选项:长度可变

(5)ICMP封包格式

在这里插入图片描述
注意:
不同的类型值以及代码值,代表不同的功能

(6)数据包的组包和解包

在这里插入图片描述


http://www.mrgr.cn/news/35418.html

相关文章:

  • 创新培养:汽车零部件图像分割
  • Conda环境、Ubuntu环境移植
  • sql文件
  • 随手记:简单实现纯前端文件导出(XLSX)
  • [OpenGL]使用OpenGL实现硬阴影效果
  • 关于我重生到21世纪学C语言这件事——指针详解(1)
  • 进度条QProgressBar
  • 数电学习基础(逻辑门电路+)
  • 失踪人口回归(明天开始继续更新学习内容)
  • 【Linux实践】实验三:LINUX系统的文件操作命令
  • 经典sql题(十一)查找共同好友或相互关注 二
  • 【大数据入门 | Hive】DDL数据定义语言(数据库DataBase)
  • Q必达任务脚本
  • asp.net core日志与异常处理小结
  • vue3开发中易遗漏的常见知识点
  • MySQL 中存储过程参数的设置与使用
  • 代码随想录Day 53|题目:110. 字符串接龙、105.有向图的完全可达性、106. 岛屿的周长
  • Linux下搭建iSCSI共享存储-Tgt
  • 【2024W36】肖恩技术周刊(第 14 期):什么是完美副业?
  • 二叉树进阶oj题【二叉树相关10道oj题的解析和代码实现】
  • 00DSP学习-F28379D学习准备(了解一个工程的构成)
  • 傅里叶变换及其应用笔记
  • JavaScript --json格式字符串和对象的转化
  • PHPStorm如何调整字体大小
  • 在Markdown中实现内部查询
  • DataWhale X 南瓜书学习笔记 task03笔记