我对使用socket()
时Linux上的协议定义之间的区别有点困惑。我试图通过TCP使用socket(PF_INET, SOCK_STREAM, proto)
来监听连接,其中proto
(在我的脑海中)有争议,或者至少看起来很奇怪。奇怪的Linux套接字协议行为
从<netinet/in.h>
:
...
IPPROTO_IP = 0, /* Dummy protocol for TCP. */
...
IPPROTO_TCP = 6, /* Transmission Control Protocol. */
...
商定由/etc/protocols
:
ip 0 IP # internet protocol, pseudo protocol number
hopopt 0 HOPOPT # hop-by-hop options for ipv6
...
tcp 6 TCP # transmission control protocol
...
我从网上教程中学和也从该名男子页tcp(7)
您初始化使用
tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
其中工作绝对好,当然是一个TCP套接字。有关使用上述论点初始化一个插座的一件事是代码
struct timeval timeout = {1, 0};
setsockopt(tcp_socket, 0, SO_RCVTIMEO, &timeout, sizeof(timeout); // 1s timeout
// Exactly the same for SO_SNDTIMEO here
作品精美绝伦,但不替换所有协议参数(包括socket()
)与IPPROTO_TCP
后,相对于IPPROTO_IP
他们有, 如上。
因此与差异实验后,我需要问几个搜索的问题:
- 为什么,当我
IPPROTO_TCP
取代所有协议参数,做我得到错误92(“协议不可用” )当设置超时时,协议0显然只是一个'虚拟'的TCP? - 为什么
socket()
需要当该信息从协议中隐含地知道(总是?)时它应该是流,数据报还是原始套接字的信息,反之亦然? (即,TCP是流协议,UDP是数据报协议,...) - “虚拟TCP”是什么意思?
- 什么是
hopopt
,为什么它与'ip'具有相同的协议号?
非常感谢。
啊,谢谢!我认为我在'tcp(7)'中被这句话推翻了:“例如,为了表明一个选项要被TCP协议解释,_level_应该被设置为TCP的协议号”,但是设置超时是在套接字API级别执行? – Doddy
超时位于套接字API级别。 tcp(7)联机帮助页描述了TCP级别的可用选项。 – nos
中间还有一个级别,即IPPROTO_IP。这些被列在ip(7)中。 –