好了,我現(xiàn)在已經(jīng)來了,我將和所有人共享我的知識了。如果你了解 C 語言并想穿過 網(wǎng)絡(luò)編程的沼澤,那么你來對地方了。
--------------------------------------------------------------------------------
讀者
這個(gè)文檔是寫成一個(gè)指南,而不是參考書。如果你剛開始 socket 編程并想找一本入門書,那么你是我的讀者。這可不是一本完全的 socket 編程書。
--------------------------------------------------------------------------------
平臺和編譯器
這篇文章中的大多數(shù)代碼都在一臺 Linux PC 上用 GNU 的 gcc 成功編譯過。 而且他們在一臺 HPUX 上用gcc 也成功編譯過。但是注意,并不是每個(gè)代碼 片段都獨(dú)立測試過。
--------------------------------------------------------------------------------
目錄:
什么是套接口?
Internet 套接口的兩種類型
網(wǎng)絡(luò)理論
struct--要么了解他們,要么等異形入侵地球
Convert the Natives!
IP 地址和如何處理他們
socket()--得到文件描述符!
bind()--我們在哪個(gè)端口?
connect()--Hello!
listen()--有人給我打電話嗎?
accept()--"Thank you for calling port 3490."
send() 和 recv()--Talk to me, baby!
sendto() 和 recvfrom()--Talk to me, DGRAM-style
close() 和 shutdown()--滾開!
getpeername()--你是誰?
gethostname()--我是誰?
DNS--你說“白宮”,我說 "198.137.240.100"
客戶-服務(wù)器背景知識
簡單的服務(wù)器
簡單的客戶端
數(shù)據(jù)報(bào) Socket
阻塞
select()--多路同步 I/O,酷!
參考資料
Disclaimer and Call for Help
--------------------------------------------------------------------------------
什么是 socket?
你始終聽到人們談?wù)撝?"socket",而你不知道他的確切含義。那么,現(xiàn)在我告訴你: 他是使用 Unix 文件描述符(fiel descriptor) 和其他程序通訊的方式。
什么?Ok--你也許聽到一些 Unix 高手 (hacker) 這樣說:“呀,Unix 中所有的東西就是文件!”那個(gè)家伙也許正在說到一個(gè)事實(shí):Unix 程序在執(zhí)行任何形式的 I/O 的時(shí)候,程序是在讀或者寫一個(gè)文件描述符。一個(gè)文件描述符只是一個(gè)和打開的文件相關(guān)聯(lián)的整數(shù)。
但是(注意后面的話),這個(gè)文件可能是一個(gè)網(wǎng)絡(luò)連接,F(xiàn)IFO,管道,終端,磁盤上的文件 或者什么其他的東西。Unix 中所有的東西是文件!因此,你想和 Internet 上別 的程序通訊的時(shí)候,你將要通過文件描述符。相信剛才的話。
現(xiàn)在你腦海中或許冒出這樣的念頭:“那么我從哪里得到網(wǎng)絡(luò)通訊的文件描述符呢,聰明人?”無論如何,我要回答這個(gè)問題:你利用系統(tǒng)調(diào)用 socket()。他返回套接口描 述符 (socket descriptor),然后你再通過他來調(diào)用 send() 和 recv()。
“但是...”,你可能現(xiàn)在叫起來,“如果他是個(gè)文件描述符,那么為什么不用一般的調(diào)用 read() 和 write()來通過套接口通訊?”簡單的答案是:“你可以使用 一般的函數(shù)!”。詳細(xì)的答案是:“你可以,但是使用 send() 和recv() 讓你更好的控制數(shù)據(jù)傳輸!
有這樣一個(gè)事實(shí):在我們的世界上,有很多種套接口。有 DARPA Internet 地址 (Internet 套接口),本地節(jié)點(diǎn)的路徑名 (Unix 套接口),CCITT X.25 地址 (你可以完全忽略 X.25 套接口)。
也許在你的 Unix 機(jī)器上還有其他的。我們在這里只講第一種:Internet 套接口。
--------------------------------------------------------------------------------
Internet 套接口的兩種類型
什么意思?有兩種 Internet 套接口?是的。不,我在撒謊。其實(shí)還有很多,但是我可不想 嚇著你。我們這里只講兩種。
Except for this sentence, where I'm going to tell you that "Raw Sockets" are also very powerful and you should look them up.
好了,好了。那兩種類型是什么呢?一種是 "Stream Sockets",另外一種是 "Datagram Sockets"。我們以后談到他們的時(shí)候也會用到 "SOCK_STREAM" 和 "SOCK_DGRAM"。
數(shù)據(jù)報(bào)套接口有時(shí)也叫“無連接套接口”(如果你確實(shí)要連接的時(shí)候用 connect()。)
流式套接口是可靠的雙向通訊的數(shù)據(jù)流。如果你向套接口安順序輸出“1,2”,那么他們將安順序“1,2”到達(dá)另一邊。他們也是無錯(cuò)誤的傳遞的,有自己的錯(cuò)誤控制。
有誰在使用流式套接口?你可能聽說過 telnet,不是嗎?他就使用流式套接口。你需要你所輸入的字符按順序到達(dá),不是嗎?同樣,WWW 瀏覽器使用的 HTTP 協(xié)議也使用他們。實(shí)際上,當(dāng)你通過端口80 telnet 到一個(gè) WWW 站點(diǎn),然后輸入 “GET pagename” 的時(shí)候,你也可以得到 HTML 的內(nèi)容。
為什么流式套接口可以達(dá)到高質(zhì)量的數(shù)據(jù)傳輸?他使用了“傳輸控制協(xié)議 (The Transmission Control
Protocol)”,也叫 “TCP” (請參考 RFC-793 獲得詳細(xì)資料。)TCP 控制你的數(shù)據(jù)按順序到達(dá)并且沒有錯(cuò)誤。你也許聽到 “TCP” 是因?yàn)槁牭竭^ “TCP/IP”。這里的 IP 是指 “Internet協(xié)議”(請參考 RFC-791.) IP 只是處理 Internet 路由而已。
那么數(shù)據(jù)報(bào)套接口呢?為什么他叫無連接呢?為什么他是不可靠的呢?恩,有這樣的事實(shí):如果你發(fā)送一個(gè)數(shù)據(jù)報(bào),他可能到達(dá),他可能次序顛倒了。如果他到達(dá),那么在這個(gè)包的內(nèi)部是無錯(cuò)誤的。
數(shù)據(jù)報(bào)也使用 IP 作路由,但是他不選擇 TCP。他使用“用戶數(shù)據(jù)報(bào)協(xié)議 (User Datagram Protocol)”,也叫 “UDP” (請參考 RFC-768.)
為什么他們是無連接的呢?主要原因是因?yàn)樗⒉幌罅魇教捉涌谀菢泳S持一個(gè)連接。 你只要建立一個(gè)包,在目標(biāo)信息中構(gòu)造一個(gè) IP 頭,然后發(fā)出去。不需要連接。應(yīng)用程序有: tftp, bootp 等等。
“夠了!”你也許會想,“如果數(shù)據(jù)丟失了這些程序如何正常工作?”我的朋友,每個(gè)程序在 UDP 上有自己的協(xié)議。例如,tftp協(xié)議每發(fā)出一個(gè)包,收到者發(fā)回一個(gè)包來說“我收到了!” (一個(gè)“命令正確應(yīng)答”也叫“ACK”包)。如果在一定時(shí)間內(nèi)(例如5秒),發(fā)送方?jīng)]有收到應(yīng)答, 他將重新發(fā)送,直到得到 ACK。這一點(diǎn)在實(shí)現(xiàn) SOCK_DGRAM 應(yīng)用程序的時(shí)候非常重要。
--------------------------------------------------------------------------------
網(wǎng)絡(luò)理論
既然我剛才提到了協(xié)議層,那么現(xiàn)在是討論網(wǎng)絡(luò)究竟如何工作和演示 SOCK_DGRAM 的工作。當(dāng)然,你也可以跳過這一段,如果你認(rèn)為 已經(jīng)熟悉的話。
朋友們,現(xiàn)在是學(xué)習(xí) 數(shù)據(jù)封裝 (Data Encapsulation) 的時(shí)候了! 這非常非常重要。It's so important that you might just learn about it if you take the networks course here at Chico State ;-).
主要的內(nèi)容是:一個(gè)包,先是被第一個(gè)協(xié)議(在這里是 TFTP )包裝(“封裝”), 然后,整個(gè)數(shù)據(jù)(包括 TFTP 頭)被另外一個(gè)協(xié)議(在這里是 UDP )封裝,然后下 一個(gè)( IP ),一直重復(fù)下去,直到硬件(物理)層( Ethernet )。
當(dāng)另外一臺機(jī)器接收到包,硬件先剝?nèi)?Ethernet 頭,內(nèi)核剝?nèi)?IP 和 UDP 頭,TFTP 程序再剝?nèi)?TFTP 頭,最后得到數(shù)據(jù)。
現(xiàn)在我們終于講到臭名遠(yuǎn)播的 網(wǎng)絡(luò)分層模型 (Layered Network Model)。
這種網(wǎng)絡(luò)模型在描述網(wǎng)絡(luò)系統(tǒng)上相對其他模型有很多優(yōu)點(diǎn)。例如,你可以寫一個(gè)套接口程序而不用關(guān)心數(shù)據(jù)的物理傳輸(串行口,以太網(wǎng),連接單元接口 (AUI) 還是其他介質(zhì)。
- 2020年計(jì)算機(jī)軟考《網(wǎng)絡(luò)工程師》復(fù)習(xí)要點(diǎn)歸納
- 2020年計(jì)算機(jī)軟考《網(wǎng)絡(luò)工程師》復(fù)習(xí)知識點(diǎn)匯集
- 2020年計(jì)算機(jī)軟考網(wǎng)絡(luò)工程師必背考點(diǎn)解析
- 2020年計(jì)算機(jī)軟件水平考試《網(wǎng)絡(luò)工程師》備考要點(diǎn)
- 2020年計(jì)算機(jī)軟考《網(wǎng)絡(luò)工程師》備考知識點(diǎn)匯集
- 2020年計(jì)算機(jī)軟考《網(wǎng)絡(luò)工程師》知識點(diǎn)總結(jié)
- 查看計(jì)算機(jī)軟件水平考試全部文檔 >>