📘
Beej's Guide to Network Programming 正體中文版
  • 簡介
  • 原著資訊
  • 譯者誌謝
  • 進階資料
  • 簡體中文版
  • 中文授權
  • 聯絡譯者
  • 1. 導讀
    • 1.1. 本書的讀者
    • 1.2. 平台與編譯器
    • 1.3. 官方網頁與書本
    • 1.4. Solaris/SunOS 程式設計師該注意的事
    • 1.5. Windows 程式設計師該注意的事
    • 1.6. 來信原則
    • 1.7. 鏡射站台(Mirroring)
    • 1.8. 譯者該注意的
    • 1.9. 版權與散佈
  • 2. 何謂 Socket
    • 2.1 兩種 Internet Sockets
    • 2.2 底層漫談與網路理論
  • 3. IP address、結構與資料轉換
    • 3.1. IPv4 與 IPv6
      • 3.1.1. Sub network (子網段)
      • 3.1.2. Port Number(連接埠號碼)
    • 3.2. Byte Order(位元組順序)
    • 3.3. 資料結構
    • 3.4. IP 位址,續集
      • 3.4.1 Private Network
  • 4. 從 IPv4 移植為 IPv6
  • 5. System call 或 Bust
    • 5.1. getaddrinfo()-準備開始!
    • 5.2. socket()-取得 File Descriptor!
    • 5.3. bind()- 我在哪個 port?
    • 5.4. connect(),嘿!你好。
    • 5.5. listen()-有人會呼叫我嗎?
    • 5.6. accept()- 謝謝你 call 3490 port
    • 5.7. send() 與 recv()- 寶貝,我們來聊天!
    • 5.8. sendto() 與 recvfrom()- 來點 DGRAM
    • 5.9. close() 與 shutdown()- 你消失吧!
    • 5.10. getpeername()-你是誰?
    • 5.11. gethostname()-我是誰?
  • 6. Client-Server 基礎
    • 6.1. 簡單的 Stream Server
    • 6.2. 簡單的 Stream Client
    • 6.3. Datagram Sockets
  • 7. 進階技術
    • 7.1. Blocking(阻塞)
    • 7.2. select():同步 I/O 多工
    • 7.3. 不完整傳送的後續處理
    • 7.4. Serialization:如何封裝資料
    • 7.5. 資料封裝
    • 7.6. 廣播封包:Hello World!
  • 8. 常見的問題
  • 9. Man 使用手冊
    • 9.1. accept()
    • 9.2. bind()
    • 9.3. connect()
    • 9.4. close()
    • 9.5. getaddrinfo(), freeaddrinfo(), gai_strerror()
    • 9.6. gethostname()
    • 9.7. gethostbyname(), gethostbyaddr()
    • 9.8. getnameinfo()
    • 9.9. getpeername()
    • 9.10. errno
    • 9.11. fcntl()
    • 9.12. htons(), htonl(), ntohs(), ntohl()
    • 9.13. inet_ntoa(), inet_aton(), inet_addr
    • 9.14. inet_ntop(), inet_pton()
    • 9.15. listen()
    • 9.16. perror(), strerror()
    • 9.17. poll()
    • 9.18. recv(), recvfrom()
    • 9.19. select()
    • 9.20. setsockopt(), getsockopt()
    • 9.21. send(), sendto()
    • 9.22. shutdown()
    • 9.23. socket()
    • 9.24. struct sockaddr and pals
  • 10. 參考資料
    • 10.1. 書籍
    • 10.2. 網站參考資料
    • 10.3. RFC
  • 11. 原著誌謝
Powered by GitBook
On this page
Edit on GitHub
  1. 2. 何謂 Socket

2.2 底層漫談與網路理論

Previous2.1 兩種 Internet SocketsNext3. IP address、結構與資料轉換

Last updated 2 years ago

因為我只著重於協定的分層,該是談談網路是如何真正的運作的時候了,並呈現一些如何打造 SOCK_DGRAM 封包的例子。就實務面,你或許可以跳過這一節,不過,這一節有很好的觀念背景,所以需要的人可以讀一讀。

嘿!孩子們,該是學習資料封裝(Data Encapsulation)的時候了。這很重要,它就是如此重要,即使你是在加州這裡上的網路課程,也只能學到皮毛。

基本上我們會講到這些內容:

封包的誕生、將封包打包[封裝]到第一個協定[所謂的 TFTP 協定]的 header 中[幾乎是最底層了],接著將全部的東西[包含 TFTP header]封裝到下一個協定中[所謂的 UDP],接著下一個協定[IP],最後銜接到硬體[實體]層上面的通訊協定[所謂的 Ethernet,乙太網路]。

當另一台電腦收到封包時,硬體會解開 Ethernet header,而 kernel 會解開 IP 與 UDP header,再來由 TFTP 程式解開 TFTP header,最後程式可以取得資料。

現在我最後要談個聲名狼藉的分層網路模型(Layered Network Model),亦稱 "ISO/OSI"。這個網路模型介紹了一個網路功能系統,有許多其它模型的優點。例如,你可以寫剛好一樣的 socket 程式,而不用管資料在實體上是怎麼傳送的[Serial、thin Ethernet、AUI 之類]。因為在底層的程式會幫你處理這件事。真正的網路硬體與拓樸對 socket 程式設計師而言是透明的。

不囉嗦,我將介紹這個成熟模型的分層。為了網路課程的測驗,要記住這些。

Application(應用層) Presentation(表現層) Session(會談層) Transport(傳輸層) Network(網路層) Data Link(資料鏈結層) Physical(實體層)

實體層就是硬體(serial、Ethernet 等)。而應用層你可以盡可能的想像,這是個使用者與網路互動的地方。

現在這個模型已經很普及,所以你如果願意的話,或許可以將它當作一本汽車修理指南來用。與 Unix 比較相容的分層模型有:

應用層(Application layer:telnet、ftp 等) 主機到主機的傳輸層(Transport layer:TCP、UDP) 網際網路層(Internet layer:IP 與路由遶送) 網路存取層(Network Access Layer:Ethernet、wi-fi、諸如此類)

此時,你或許能知道這幾層是如何對應到原始資料的封裝。

看看在打造一個簡單的封包需要多少工作呢?

天阿!你得自己用 "cat" 將資訊填入封包的 header 裡!

開玩笑的啦。

你對 stream socket 需要做的只有用 send() 將資料送出。而在 datagram socket 需要你做的是,用你所選擇的方式封裝該封包,並且用 sendto() 送出。Kernel 會自動幫你建立傳輸層與網路層,而硬體處理網路存取層。啊!真現代化的技術。

所以該結束我們短暫的網路理論之旅了。

喔!對了,我忘記告訴你我想要談談 routing(路由遶送)了。恩,沒事!沒關係,我不打算全部講完。

Router(路由器)會解開封包的 IP header,參考自己的 routing table(路由表)…。如果你真的很想知道,你可以讀 IP RFC [9]。如果你永遠都不想碰它,其實你也可以過得很好。

[9]

http://tools.ietf.org/html/rfc791