日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux 核心--11.網(wǎng)絡(luò)( 五 )



下層網(wǎng)絡(luò)設(shè)備接收的包必須由經(jīng)正確的INET和BSD socket才能被處理 。因此,UDP和TCP維護了一些hash表用來在輸入IP消息內(nèi)查找地址并將它們導(dǎo)向正確的 socket/sock 對 。TCP是一個面向連接的協(xié)議,因而涉及處理TCP包的信息比用于處理UDP包的信息多 。

UDP維護著一張已分配UDP端口表,udp_hash 表 。由指向 sock 數(shù)據(jù)結(jié)構(gòu)的指針組成,通過一個基于端口號的hash函數(shù)來索引 。UDPhash表比允許的端口號的數(shù)目小得多(udp_hash 為128 或者說是 UDP_HTABLE_SIZE?。┍碇械囊恍╉椫赶蛞粋€ sock 結(jié)構(gòu)鏈,該鏈用每個 sock 結(jié)構(gòu)中的 next 指針來將每個 sock 連接起來 。

TCP是十分復(fù)雜的,它包括幾個hash表 。但實際上TCP在綁定操作時沒有將 sock 結(jié)構(gòu)與其hash表綁定,它僅僅檢查被請求的端口號當(dāng)前沒被使用 。sock 結(jié)構(gòu)是在 listen 操作時被加入TCP的hash表的 。

復(fù)習(xí)提要: What about the route entered?


10.4.3在INET BSD Socket上建立連接
建立一個socket,如果沒有用它來監(jiān)聽連入請求,那么就能用它來發(fā)連出請求 。對于面向無連接的協(xié)議如UDP來說,這一socket操作并不做許多事,但對于面向連接的協(xié)議如TCP來說,這一操作包括了在兩個應(yīng)用間建立一個虛連接 。
一個連出連接操作只能由一個在正確狀態(tài)下的INET BSD socket來完成;換句話說,socket不能是已建立連接的,并且有被用來監(jiān)聽連入連接 。這意味著BSD socket 結(jié)構(gòu)必須是 SS_UNCONNECTED 狀態(tài) 。UDP協(xié)議沒有在兩個應(yīng)用間建立虛連接,任何發(fā)出的消 息都是數(shù)據(jù)報,這些消息可能到達(dá)也可能不到達(dá)目的地 。但它不支持BSD socket的 connect 操作 。建立在UDP的INET BSD socket上的連接操作簡單地設(shè)置遠(yuǎn)程應(yīng)用的地址:IP地址和IP端口號 。另外,它還設(shè)置路由表入口的cache以便這一BSD socket在發(fā)用UDP包時不用再次查詢路由數(shù)據(jù)庫(除非這一路由已經(jīng)無效) 。INET sock 結(jié)構(gòu)中的 ip_route_cache 指針指向路由緩存信息 。如果沒有給出地址信息,緩存的路由和IP地址信息將自動地被用來發(fā)送消息 。UDP將 sock 的狀態(tài)改為 TCP_ESTABLISHED。

對于基于TCP BSD socket的連接操作,TCP必須建立一個包括連接信息的TCP消息,并將它送到目的IP 。TCP消息包含與連接有關(guān)的信息,一個唯一標(biāo)識的消息開始順序號,通過初始化主機來管理的消息大小的最大值,及發(fā)送與接收窗口大小等等 。在TCP內(nèi),所有的消息都是編號的,初始的順序號被用來作為第一消息號 。Linux選用一個合理的隨機值來避免惡意協(xié)議沖突 。每一從TCP連接的一端成功地傳到另一端的消息要確認(rèn)其已經(jīng)正確到達(dá) 。未確認(rèn)的消息將被重傳 。發(fā)送與接收窗口的大小是第一個確認(rèn)到達(dá)之前消息的個數(shù) 。消息尺寸的最大值與網(wǎng)絡(luò)設(shè)備有關(guān),它們在初始化請求的最后時刻確定下來 。如果接收端的網(wǎng)絡(luò)設(shè)備的消息尺寸最大值更小,則連接將以小的一端為準(zhǔn) 。應(yīng)用程序發(fā)出連接請求后必須等待目標(biāo)應(yīng)用程序的接受或拒絕連接的響應(yīng) 。TCP sock 期望著一個輸入消息,它被加入 tcp_listening_hash 以便輸入TCP消息能被指向這一 sock 結(jié)構(gòu) 。TCP同時也開始計時,當(dāng)目標(biāo)應(yīng)用沒有響應(yīng)請求,則連出連接請求超時 。

10.4.4監(jiān)聽 INET BSD Socket
socket與地址綁定后,能監(jiān)聽指定地址的連入連接請求 。一個網(wǎng)絡(luò)應(yīng)用程序能監(jiān)聽socket而不用先將地址 與之綁定;在這個例子中,INET socket層找到一個未用的端口號(對這一協(xié)議)并自動將它與socket綁定 。監(jiān)聽socket函數(shù)將socket狀態(tài)設(shè)成 TCP_LISTEN,并做其它連入連接所需要的工作 。

對于UDP sockets,改變socket的狀態(tài)就足夠了,而TCP現(xiàn)在加了socket的 sock 數(shù)據(jù)結(jié)構(gòu)到兩個hash表中并激活,tcp_bound_hash 表和 tcp_listening_hash 表 。這兩個表都通過一個基于IP端口號的hash函數(shù)來索引 。

推薦閱讀