什么是HOPOPT协议以及socket()如何工作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是HOPOPT协议以及socket()如何工作?相关的知识,希望对你有一定的参考价值。

我正在搞乱C中的套接字,这个协议继续出现,我找不到任何关于它的东西,那么它用于什么? HOPOPT和IP有什么区别?

另外我不明白为什么socket()函数的最后一个参数应为0.根据手册页:

该协议指定了与套接字一起使用的特定协议。通常,只有一个协议支持给定协议族中的特定套接字类型,在这种情况下协议可以指定为0.但是,可能存在许多协议,在这种情况下,必须在此指定特定协议方式。要使用的协议号特定于进行通信的“通信域”;见协议(5)。有关如何将协议名称字符串映射到协议号,请参阅getprotoent(3)。

据我所知,将最后一个参数设置为0会让标准库决定使用哪个协议,但在哪种情况下会使用0以外的数字?

答案

HOPOPT是Hop-by-Hop IPv6 extension header的首字母缩写。它是一个标头,允许向IPv6数据包添加更多选项。 IPv6数据包包含此标头是正常的。

socket()是BSD和其他人(Linux等人)提供的系统调用,用于创建新的套接字,即网络连接的内部表示。创建新套接字时,必须指定所需的协议:TCP,UDP等,可以通过IPv4,IPv6等。

您引用的段落解释了每种套接字类型可能存在一个或多个协议。

如果只存在一个,则protocol参数必须为零。例如,SOCK_STREAM套接字仅由TCP实现:

int sk = socket(AF_INET, SOCK_STREAM, 0);

如果存在更多,则必须指定要使用的特定协议。例如,SOCK_SEQPACKET类型可以使用SCTP协议实现:

int sk = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);

所以,最后:

  • 如果要创建套接字,请选择要使用的协议,例如TCP over IPv4。
  • HOPOPT在IPv6数据包中完全正常。如果您看到它出现在跟踪中,因为您创建了一个IPv6套接字(使用AF_INET6),就可以了。

以上是关于什么是HOPOPT协议以及socket()如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

HTTP长连接是啥?底层是如何工作的?Tomcat是如何实现长连接的?

php socket 如何实现非阻塞

UDP socket 编程以及IO多路复用

如何在Spring中配置Websocket

socket 套接字编程

回退如何与 socket.io 一起工作?