我對使用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)中。 –