什么是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()如何工作?的主要内容,如果未能解决你的问题,请参考以下文章