核心版本:2.6.34
在發送報文時,可以調用函數setsockopt()來設定相應的選項,本文主要分析IP選項的產生,發送以及 接收所執行的流程,選取了LSRR為例子進行說明,主要分為選項的產生、選項的轉寄、選項的接收三部分。
先看一個來源站點路 由選項的例子,下文的說明都將以此為例。
主機IP:192.168.1.99
源路由:192.168.1.1 192.168.1.2 192.168.1.100 [dest ip]
來源站點路由選項在各個主機上的情況:
該圖與<TCP/IP卷一>上的樣本不同,因為這裡的選項[#R1, R2, D]是以實際傳輸中的形式標註的,下圖是來源站點路由選項在此過程 中的具體形式:
建立socket時, 可以使用setsockopt()來設定建立socket的各種屬性,setsockopt()最終調用系統介面sys_setsockopt()。
sys_setsockopt ()
level(層級)指定系統中解釋選項的代碼:通用的套介面代碼,或某個特定協議的代碼。level==SOL_SOCKET是通用的套接 口選項,即不是針對於某個協議的套介面的,使用通過函數sock_setsockopt()來設定選項;level其它值:IPPROTO_IP, IPPROTO_ICMPV6, IPPROTO_IPV6則是特定協議套介面的,使用sock->ops->setsockopt(通訊端特定函數)來設定選項。
if (level == SOL_SOCKET) err = sock_setsockopt(sock, level, optname, optval, optlen); else err = sock->ops->setsockopt(sock, level, optname, optval, optlen);
下面具體說明這個例子,產生選項 - 使用setsockopt()可以設定IP選項,形式如下:
setsockopt(fd, IPPROTO_IP, IP_OPTIONS, &opt, optlen);
其中傳入的opt格式如下:
無論是何種報文(對應不同的sock),設定IP選項最終都會調用ip_setsockopt()。比如建立 的UDP socket,則調用流程為:sock->ops->setsockopt() => udp_setsockopt() -> ip_setsockopt()。而 處理IP選項的主要是由do_ip_setsockopt()來完成的。