计算使用的套接字选项的大小

时间:2015-02-26 13:19:54

标签: sockets tcp udp connection ip

为什么没有用于确定实际设置了哪些套接字选项的API? (安全性?但无论如何都可以使用本地和远程端点)

除了派生套接字并手动存储信息之外,如何在不重复任何可能选项的情况下获取套接字上使用的所有选项?

(导出是相关的,只是因为您可以跟踪自己需要的信息,例如选项大小以及它是否也是物理设置选项。)

我的主要问题主要如下:

在获得所需信息后,如何轻松确定哪些选项不会占用MTU定义的有效负载部分中的空间?

(最大片段大小,不要片段等等,在MTU描述的有效载荷中占用大小,可能与普遍看法相反)

我想在可能的情况下在套接字上执行发送或接收之前知道此信息。

请尽可能与平台无关,例如。仅使用Berkeley套接字API方法而不是系统调用。

示例编程语言可以是您编程接受的任何内容。

更新

这是一个使用' lsof'作为解决方案,虽然它的特定于操作系统Display socket options

不幸的是,我似乎需要研究一下才能将其应用到Windows中,因为我不确定那里是否存在类似的内容,如果不是,我可能会发布' ps-sockets'添加到有用的&#p; pstools'库。

更新 http://www.thegeekstuff.com/2012/03/ip-protocol-header/

这就是ip标头,并且证明选项可以占用空间,并且标头最多可以达到60个字节。使用选项时(最多4位是15(* 4)= 60)。

更新 上面现有解决方案的最大问题是它不会显示选项在IP头中它只显示套接字实例上的选项。

我的问题具体是获取套接字选项,这些选项占用了应用程序无法在协议级别访问的ip头中的空间。

简而言之

我想知道给定任何协议的套接字s我可以将多少bytes放入一个没有碎片的SINGLE有效负载中。

然后,

payload将由接口的MTU指定。

这是因为如果除了底层协议头和有效负载之外的网络头不适合MTU定义的空间,TCP或UDP将被分段。

因此,我想知道IP头中已经使用了多少字节,然后又说明了套接字协议已经使用了多少字节。

即。 TCP具有MINIMUM标头大小,以及UDP以及任何协议。

如果我想发送1500个字节并且我的MTU是1500字节,我不能将所有bytes放入单个网络数据包payload,因为IP和底层网络标头不适合;因此数据为fragmented,并且发送两个IP数据包(及其随附的网络标头)以传输总共1500个字节。

我想知道是否有一种简单的方法可以在不使用RAW套接字的情况下确定现有协议标头的大小,而无需自己手动解析标头..

因此,我想我正在寻找的是一个建议or a hack`使用其中一个可用的套接字函数或它们的应用程序层类似的返回值,我不知道或者不熟悉哪些允许我确定此信息。

因此我知道通过派生socket我可以跟踪这些信息,计算在连接阶段将使用的字节,并且如果可能的话,使用Application层可以智能地避免碎片先前获得套接字配置的知识。

我也很好奇为什么这些信息来自hidden的{​​{1}}用户,这些信息似乎非常重要,例如如果我是服务器并且客户端使用特殊选项并且这样的套接字实例传递给我,那么我应该能够根据其先前的配置智能地使用套接字。

恕我直言,这是因为套接字只不过是文件描述符上面的一个小接口,其基础是在任何操作系统中实现所有输入和输出。

为了完整起见,除了我的一篇文章之外,我直接参考了这个主题:

计算机连接到其他计算机的网络,网络连接到其他网络,形成更大的网络,计算机是唯一对我们日常生活负责的东西。

计算机需要一个操作系统来允许通常与计算机编程相关的基本交互,例如时间共享和程序的并发执行。

流行的消费者操作系统实现包括:Windows,Unix,Apple或其他;思科,三星甚至整个国家(如朝鲜和中国)等大型公司都会集中资源并创建操作系统。

有许多本土操作系统通过其固件和它们链接的标准库实现,以提供逻辑执行或数据传输存储,以及允许内部和外部交互的有用和安全通信。系统的要求及其存在的目的。

在示例中,假设sockets公开的所有互联网协议实现允许传输“RAW”和“#”。以及但不限于IP,TCP,UDP,ICMP和各种其他协议实现,它们可能或可能不依赖于套接字本身的接口,即特定的端点对话,但包括底层的基于端口的通信(串行或并行)其中[如IOControl提供的那样]。

更简洁地说,sockets的大部分实现都是按特权划分的功能,在大多数情况下通常不属于API的一部分;因此,某些概念只能在这种实现中的特权上下文中实现,这些实现禁止实现的用户执行为主管[更多特权用户]指定的操作,否则可能通过破坏所做的断言来破坏应用程序的完整性。在实现中或与内部进程以及外部系统接口的其他组件或系统,例如但不限于:< Unix Domain Sockets','命名管道',&# 39;文件描述符'伯克利套接字分发&#39 ;;      和其他此类协议实现网络或其他。

物理硬件具有用于公开功能的软件实现,通常使用sockets或基于端口的编程概念,例如sockets [输入和输出],以提供兼容的应用程序编程接口' [在我看来]因为应用程序二进制接口'实施已经存在,因此交换信息[消息]非常容易,交换结果可以允许某些合理的期望。

总结由于真实硬件如何工作,如网络,图形,输入和输出或其他方式以及大多数操作系统的实现方式;内存相对于其寄存器是相对本地的;因此,诸如堆栈'堆积','分配'等概念。等等本质上是同时的,我们利用线程'驻留在进程中以允许在人类对时间的理解中共享资源,并且通常该功能由称为调度程序的软件提供并且是计算机系统的底层操作系统的一部分,可能存在许多处理器和存储器然而,计算机系统中的一些空间通常永远不会被计算机的用户或主管访问,这仅仅是因为它们被认为是不需要这种交互的组件,或者对于暴露给用户或主管是危险的。 / p>

2 个答案:

答案 0 :(得分:-1)

  

为什么你认为没有api来确定实际设置了什么套接字选项?

有。 getsockopt().

  

但是无论如何都可以使用本地和远程终点

我不知道这是多么相关。

  

除了派生套接字和手动存储信息

之外

这没有意义。 “派生套接字”不会传达任何信息,也不会“手动存储”。

  

如何在没有迭代任何可能选项的情况下获得套接字上使用的所有选项?

你不能。

  

在获得所需信息后,如何轻松确定哪些选项不会占用MTU定义的有效负载部分中的空间?

套接字选项不会占用有效负载部分的空间;有效载荷部分不是由MTU定义的;这个问题没有意义。

  

我想在可能的情况下在套接字上执行发送或接收之前知道此信息。

我怀疑你是否需要它,因为你的问题建立在许多错误观念之上。

答案 1 :(得分:-1)

如果不打开自己的原始套接字并手动检查IP标头,就无法做到这一点。

除非您的操作系统或其他库已经为您提供了所需的功能,否则不会。

仅使用Berkley套接字并且不使用指定包含IP标头的套接字选项,应用程序无法访问IP标头。

由于要包含的IP标头选项是系统已知选项,因此可以在套接字实例本身上检查它,以确定应用程序是在接收还是发送IP标头。

如果它没有发送或接收自己的头文件而没有可以监视ip头的原始套接字或者可以重用相同地址但可以选择包含IP头的新套接字,那么该信息仅在那里可用协议栈。

Nuff Said。