應(yīng)用程序可以繞過(guò)傳輸層而直接使用ipv4和IPv6,這稱為原始套接口(raw socket)。http://www.CUOXin.com/nufangrensheng/p/3583435.html。
原始套接口是一種對(duì)原始網(wǎng)絡(luò)報(bào)文進(jìn)行處理的套接口。原始套接口主要應(yīng)用在底層網(wǎng)絡(luò)編程上,同時(shí)也是網(wǎng)絡(luò)黑客的必備手段。例如sniffer、拒絕服務(wù)(DoS)、IP地址欺騙等都需要在原始套接字的基礎(chǔ)上實(shí)現(xiàn)。
與原始套接字對(duì)應(yīng),之前的TCP/UDP的套接字稱為標(biāo)準(zhǔn)套接字,如下圖所示,為標(biāo)準(zhǔn)套接字與原始套接字之間的關(guān)系。標(biāo)準(zhǔn)套接字與網(wǎng)絡(luò)協(xié)議棧的TCP、UDP層打交道,而原始套接字則與IP層級(jí)網(wǎng)絡(luò)協(xié)議棧核心打交道。
原始網(wǎng)絡(luò)套接口提供普通的TCP和UDP套接口不提供的以下3個(gè)功能:
1、有了原始套接口,進(jìn)程可以讀與寫(xiě)ICMPv4、IGMPv4和ICMPv6等分組。
2、有了原始套接口,進(jìn)程可以讀與寫(xiě)內(nèi)核不處理其協(xié)議字段的IPv4數(shù)據(jù)報(bào)。
3、有了原始套接口,進(jìn)程還可以使用IP_HDRINCL套接口選項(xiàng)自行構(gòu)造IPv4頭部。
創(chuàng)建一個(gè)原始套接口涉及如下步驟:
1、把第2個(gè)參數(shù)指定為SOCK_RAW調(diào)用socket函數(shù),以創(chuàng)建一個(gè)原始套接口。第3個(gè)參數(shù)(協(xié)議類型)通常不為0。
只有超級(jí)用戶才能創(chuàng)建原始套接口。
2、可以在這個(gè)原始套接口上如下開(kāi)啟IP_HDRINCL套接口選項(xiàng):
const int on = 1;if(setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) 出錯(cuò)處理
3、可以在這個(gè)原始套接口上調(diào)用bind函數(shù),不過(guò)比較少見(jiàn)。bind函數(shù)僅僅設(shè)置本地地址,因?yàn)樵继捉涌诓淮嬖诙丝诘母拍睢?/p>
4、可以在這個(gè)原始套接口上調(diào)用connect函數(shù),不過(guò)也比較少見(jiàn)。connect函數(shù)僅僅設(shè)置遠(yuǎn)地地址,同樣因?yàn)樵继捉幼植淮嬖诙丝诘母拍睢?/p>原始套接口輸出
原始套接口的輸出遵循以下規(guī)則:
1、普通輸出通過(guò)調(diào)用sendto或sendmsg并指定宿IP地址完成。如果套接口已經(jīng)連接,那么也可以調(diào)用write、writev或send。
2、如果IP_HDRINCL套接口選項(xiàng)未開(kāi)啟,那么由進(jìn)程讓內(nèi)核發(fā)送的數(shù)據(jù)的起始地址指的是IP頭部之后的第一個(gè)字節(jié),因?yàn)閮?nèi)核將構(gòu)造IP頭部并把它置于來(lái)自進(jìn)程的數(shù)據(jù)之前。內(nèi)核把所構(gòu)造的IPv4頭部的協(xié)議字段設(shè)置成來(lái)自socket調(diào)用的第3個(gè)參數(shù)。
3、如果IP_HDRINCL套接口選項(xiàng)已開(kāi)啟,那么由進(jìn)程讓內(nèi)核發(fā)送的數(shù)據(jù)的起始地址指的是IP頭部的第一個(gè)字節(jié)。進(jìn)程調(diào)用輸出函數(shù)寫(xiě)出的數(shù)據(jù)量必須包括IP頭部的大小。整個(gè)IP頭部由進(jìn)程構(gòu)造,不過(guò):(a)IPv4標(biāo)識(shí)字段可置為0,從而告知內(nèi)核設(shè)置該值;(b)IPv4頭部校驗(yàn)和字段總是由內(nèi)核計(jì)算并存儲(chǔ);(c)IPv4選項(xiàng)字段是可選的。
4、內(nèi)核對(duì)于超出外出接口MTU的原始分組執(zhí)行分片。
原始套接口輸入遵循以下規(guī)則:
1、接收到的UDP分組和TCP分組絕不傳遞到任何原始套接口。如果一個(gè)進(jìn)程想要讀取含有UDP分組或TCP分組的IP數(shù)據(jù)報(bào),它就必須在數(shù)據(jù)鏈路層讀取這些分組。
2、大多數(shù)ICMP分組在內(nèi)核完成處理其中的ICMP消息后傳遞到原始套接口。
3、所有IGMP分組在內(nèi)核完成處理其中的IGMP消息后傳遞到原始套接口。
4、內(nèi)核不認(rèn)識(shí)其協(xié)議字段的所有IP數(shù)據(jù)報(bào)傳遞到原始套接口。內(nèi)核對(duì)這些分組執(zhí)行的唯一處理是針對(duì)某些IP頭部字段的最小驗(yàn)證:IP版本、IPv4頭部校驗(yàn)和、頭部長(zhǎng)度以及宿IP地址。
5、如果某個(gè)數(shù)據(jù)報(bào)以片段形式到達(dá),那么在它的所有片段均到達(dá)且重組出該數(shù)據(jù)報(bào)之前,不傳遞任何片段分組到原始套接口。
新聞熱點(diǎn)
疑難解答
圖片精選