对于SOCKET套接字问题的若干认识

news2024/10/7 20:29:43

1. 首先大家应该知道Socket 编程吧

Socket套接字 分为 应用层套接字  数据链路层套接字(也就是原始socket)

1.流套接字(SOCK_STREAM)

流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议 [3]。

2.数据报套接字(SOCK_DGRAM)

数据报套接字提供一种无连接、不可靠的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP( User DatagramProtocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理 [3]。

3.原始套接字(SOCK_RAW)

原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送的数据必须使用原始套接 [3]。原始套接字主要用于一些协议的开发,可以进行比较底层的操作。

原始套接字的创建:

int rawsock = socket(AF_INET,SOCK_RAW,protocol);

常见的协议类型如下:

  • l  IPPROTO_IP:            IP协议,接受或者发送IP数据包,包含IP头部
  • l  IPPROTO_ICMP: ICMP协议,接受或者发送ICMP的数据包,IP的头部不需要处理
  • l  IPPROTO_TCP:  TCP协议,接受或者发送TCP数据包
  • l  IPPROTO_UDP: UDP协议,接受或者UDP数据包
  • l  IPPROTO_RAW: 原始IP包

链路层原始套接字

socket(PF_PACKET,type,htons(protocol))

  • l  参数type设置为SOCK_RAW时:套接字接收和发送数据都是从MAC首部开始的早发送时需要由调用者从MAC首部开始构造函数和封装报文数据。该种情况是用于某些项目需要用到自定义的二层报文socket(PF_PACKET,SOCK_RAW,htons(protocol))
  • l  参数type设置SOCK_DGRAM时,套接字接收到的数据报文会将MAC首部去掉。同事在发送时也不需要手动构造MAC首部,只需要从IP首部(或ARP首部,取决去封装的报文类型)开始构造即可。而MAC首部的填充由内核实现。若对于首部不关心的场景,可以使用此类型。socket(PF_PACKET,SOCK_DGRAW,htons(protocol))

protocol不同取值:

protocol

作用

ETH_P_ALL

0x0003

接收本机收到的所有二层报文

ETH_P_IP

0x0008

接收本机收到的所有IP报文

ETH_P_ARP

0x0806

接收本机收到的所有ARP报文

ETH_P_RARP

0x8035

接收本机收到的所有RARP报文

自定义协议

比如0x0810

接收本机收到的所有类型为0x0810的二层报文

不指定

0

不能用于接收,只能用于发送

网络层原始套接字:

创建面向连接的TCP和创建面向无连接的UDP套接字,在接受和发送时只能操作数据部分,而不能对IP首部或TCP或UDP首部进行操作。如果想要操作IP首部或传输层协议首部,就需要调用如下socket()函数创建网络层原始套接字。

第一个参数指定协议族的类型为PF_INET

第二个参数为SOCK_RAW

第三个参数protocol为协议类型。

  • l  接收报文       网络层原始套接字接收到的报文数据从IP首部开始的,即接收到的数据包含了IP首部,TCP/UDP/ICMP等首部,以及数据部分。
  • l  发送报文       网络层原始套接字发送的报文数据,在默认情况下是从IP首部之后开始的,即需要由调用者自行构造和封装TCP/UDP等协议首部。这种套接字也提供了发送时从IP首部开始构造数据的功能。通过setsocketopt()个套接字设置上IP_HDRINCL选项,就需要在发送时自行构造IP首部。

protocol

作用

IPPROTO_TCP

6

接收TCP类型的报文

IPPROTO_UDP

17

接收UDP类型报文

IPPROTO_ICMP

1

接收ICMP类型报文

IPPROTO_IGMP

2

接收IGMP类型报文

IPPROTO_RAW

255

不能接收报文,只能发送(需要构造数据包首部)

IPPROTO_OSPF

89

接收协议号为89的报文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1155506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

精通Nginx(02)-Nginx安装

本文主要讲述Nginx在Linux下的yum安装方式。 Yum安装一般用root模式。 安装方式 在Linux下,Nginx安装有源码编译安装和yum(不同OS可能命令名字不一样)直接安装两种方式。两种方式优缺点如下: 源码编译安装 优点:灵活性高定制性强&#xff…

【Spring MVC】传递参数

前言: 访问不同路径就是在发送不同的请求,在发送请求时,可能会带有一些参数,所以Spring的请求主要是为了学习如何传递参数到后端以及后端如何接收。 在SpringMVC中使用RequestMapping来实现路由映射,也就是浏览器连接…

5G物联网关相较有线网关有哪些独特优势

5G为产业物联网应用带来了质的飞跃,5G技术实现更高速率、更低延迟和更大带宽,使得物联网能够接入更多数量的设备,实现更稳定、高效的连接和数据传输,在提高生产效率的同时,也进一步促进了物联网的应用发展和升级。 针对…

预约上门洗衣店洗鞋店管理软件;

洗衣店洗鞋店管理软件; 软件操作简单,专业管理进货、库存、销售、会员、利润统计和导购员提成。前台扫描销售和会员打折,会员充值消费,支持扫码支付,结账自动打印小票。手机可以查询库存和营业情况! 干洗店…

PHP连接SQLServer echo输出中文汉字显示乱码解决方法

1、查询结果有中文会显示乱码。 解决方法一&#xff08;较简单&#xff0c;建议使用&#xff09;&#xff1a; 在php文件最开头写上&#xff1a; header(Content-type: text/html; charsetUTF8); // UTF8不行改成GBK试试&#xff0c;与你保存的格式匹配 <?php header(&q…

RecyclerView自定义LayoutManager从0到1实践

此前大部分涉及到 RecyclerView 页面的 LayoutManager基本上用系统提供的 LinearLayoutManager 、GridLayoutManager 就能解决&#xff0c;但在一些特殊场景上还是需要我们自定义 LayoutManager。之前基本上没有自己写过&#xff0c;在网上看各种源码各种文章&#xff0c;刚开始…

[MySQL]索引

目录 概念解释 作用/优点 缺点 适用场景 索引的创建,删除与查看 系统对索引的自动创建 索引建立的时机 索引存储的数据结构 选择B树的原因 B树的原理 查询流程 优点 B树 与B树的区别 优点 概念解释 索引就像是一本字典的目录,我们可以根据目录快速定位到我们想…

Java架构师前沿技术

目录 1 导学2 信息物理系统2.1CPS的体系架构2.2 CPS的技术体系3 人工智能4 机器人5 边缘计算6 数字李生体7 云计算7.1 云计算的部署模式8 大数据想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导学 2 信息物理系统 信息物理系统(CPS)是控制系统、嵌入式系统的扩展与…

一张图讲清楚业务稳定性要如何做:SRE体系化稳定性方案

概述&#xff1a;作为一个SRE、运维工程师&#xff0c;当我们在治理系统稳定性时&#xff0c;方法有很多&#xff0c;但往往无从下手。本文以一张逻辑图的形式&#xff0c;为读者提供治理稳定性的体系化思路。 先上图&#xff1a; 1、治理目标 我们做稳定性的目标&#xff0c…

MySQL 基础学习笔记(二)

目录 1 约束1.1 约束概述1.2 非空约束1.3 唯一约束1.4 主键约束1.5 默认约束1.6 外键约束 2 数据库设计2.1 数据库设计概述2.2 表关系 3 多表查询3.1 多表查询概述3.2 内连接查询3.3 外连接查询3.4 子查询 4 事务4.1 事务概述4.2 四大特征 1 约束 1.1 约束概述 约束是作用于表…

Whatsapp企业号如何增粉?5个措施帮到你

收集粉丝关注的方法有很多种&#xff0c;本文将会介绍九种有效的方式&#xff0c;可以参考。 在传播信息的过程中&#xff0c;我们要需要把客户放在第一位&#xff0c;你能提供给客户什么&#xff0c;实用价值或情绪价格。给人的感觉真实吗&#xff1f;足够透明吗&#xff1f;…

[黑马程序员Pandas教程]——Pandas快速体验

目录&#xff1a; 为什么要使用Python做数据开发Python在数据开发领域的优势为什么要学习Pandas其他常用Python库介绍主要内容介绍Anaconda安装Anaconda的虚拟环境管理虚拟环境的作用可以通过Anaconda界面创建虚拟环境通过命令行创建虚拟环境通过Anaconda管理界面安装包也可以…

Linux C语言进阶-D2字符数组和字符串

字符数组&#xff1a;元素的数据类型为字符类型的数组 char c[10],ch[3][4]; 字符数组的初始化 逐个字符赋值,无\0 在下图中&#xff0c;剩余的会自动添加上\0&#xff0c;而在int中会自动添加0&#xff0c;和NULL其实是一个意思 用字符串常量有\0 字符数组长度计算 下图中&am…

你知道什么是 Ping 吗?

欢迎到我的博客浏览 胤凯 (oyto.github.io) 这次我们来看一下什么是 Ping 操作&#xff0c;以及它有什么用处&#xff0c;并且我们来动手实现一个简易版的 Ping 工具。 Ping 是什么&#xff1f; ​ ping 是一个计算机网络工具&#xff0c;通常用于测试网络连接的可达性和测…

服务器带宽忽然暴增,不停的触发告警

问题&#xff1a; 线上环境&#xff0c;服务器的外网下行带宽达到某个阈值&#xff0c;触发告警&#xff0c;查了下服务器的带宽监控信息&#xff0c;是从某个时间开始突然串上去的&#xff0c;然后监控图形非常有规律&#xff0c;都是每秒达到顶峰后&#xff0c;又立马下去了…

信息系统项目管理师教程 第四版【第9章-项目范围管理-思维导图】

信息系统项目管理师教程 第四版【第9章-项目范围管理-思维导图】 课本里章节里所有蓝色字体的思维导图

2023年云栖大会来啦!!(2022年就已经深受震撼)

2023云栖大会已经开始啦&#xff0c;让我们来回顾回顾去年的云栖大会吧。 云栖大会是中国阿里巴巴集团每年举办的一项技术盛会&#xff0c;前身可追溯到2009年的地方网站峰会&#xff0c;2011年演变为阿里云开发者大会&#xff0c;2015年正式更名为“云栖大会”&#xff0c;并且…

DL Homework 5

目录 习题4-1 对于一个神经元​编辑&#xff0c;并使用梯度下降优化参数w时&#xff0c;如果输入x恒大于0&#xff0c;其收敛速度会比零均值化的输入更慢。 习题4-5 如果限制一个神经网络的总神经元数量(不考虑输入层)为N1&#xff0c;输入层大小为​编辑&#xff0c;输出层大…

回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测

回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测 目录 回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.RIME-CNN-SVM霜冰优化算…

[SHCTF 2023 校外赛道] reverse

week1 ez_asm 想不到第1题是个汇编&#xff0c;咱也不知道拿啥能弄成c&#xff0c;不过这题也不难&#xff0c;直接能看懂&#xff0c;关键部分。 取出异或0x1e然后保存&#xff0c;再取出-0xa再保存。 .text:0000000000401566 loc_401566: …