這本書是從日文翻譯過來的, 作者是戶根勤. 和這個系列裡面的其他書一樣, 這本書超棒! 它由淺入深地介紹了網路有關的種種東西. 並不會生硬地叫大家從 OSI 開始背誦知識, 而是一步一步地從最基本的網路連接講起.
首先介紹網路如何找到你要的網址開始這個探險旅程. 首先我們會有一個 URL, 然後呢? URL 又可以分為伺服器名稱、目錄與檔案幾個部分. PC 發出一些HTTP 的命令, 像是 GET、POST、PUT 等等. 我們的 PC 上的 web browser 會以 HTTP 特定的格式發出這些命令, HTTP server 收到這些東西之後, 就會給出回應.
但是光知道 HTTP 伺服器的 URL, 又怎麼找到它的 IP address 呢? 這個就要去問 DNS (domain name server).
DNS 查詢的動作, 基本上是一個名稱的解析 (name resolution、DNS resolver), 用 Socket library 就可以呼叫解析器.
<記憶體區域> = gethostbyname(www.abc.com);
傳回的這一塊記憶體, 裡面就會有 IP address. 當然, 中間的過程牽涉到 web 程式 call Socket library 裡面的 gethostbyname(), 而這隻 function 又會去 call OS 內部的 TCP/IP module, TCP/IP module 去 call LAN 網卡驅動程式, 底下才是網卡去和伺服器溝通.
世界上有不同等級的 DNS, 畢竟不是每個 DNS 都放置了全世界的 IP address 與 URL 的對應表. 不知道的東西, 就會層層回報到根網域, 據說這個等級的 DNS 全世界只有 13 部.
書中又特別強調: Socket library 和 socket 是不一樣的, socket 是一個插槽, 相當於一個check in 的動作. 帶著 IP address 和 port number check in 之後就拿到描述器, 相當於是旅館的預約號碼或是房間號碼.
無論在應用程式端 (Web browser 等等) 或是伺服器端, 都會有產生 socket 的動作, 而各自拿到描述器. 應用程式端的描述器變成 connect() 指令的參數, 而伺服器端的描述器則變成 bind() 指令的參數. Bind() 功能是瀏覽器所沒有的, 它會檢查每個 port 所註冊的伺服器程式各自是甚麼? 接著開始 listen().
應用程式以 connect() 來連接伺服器, 跟伺服器說房號 XXX 的客人來了, 伺服器就依據 port對應到的程式來 accept() 這個 connect(). 並且關掉現在的描述器, 產生新的描述器. 我們可想像是把預約號碼換成了房間號碼.
當應用程式 write() 資料過來後, 伺服器就用 read() 來接收, 應用程式送完資料後 close(), 伺服器也 close().
以上就是第一章的重點, 是不是還挺有趣的呢?