TCP IP Socket In C, 2e - chapter 1 Introduction

前言

這裏直接給出書的鏈接書中代碼的鏈接,以後只會提到使用的是哪些文件以及其鏈接。

本章是基礎概念,建議補計算機網絡基礎,這裏不全.

1 網絡,數據包,協議

計算機網絡是多臺主機和路由器通過通信信道(communication channels)連接起來的。有三個實體:

  • 主機,運行程序
  • 路由器,轉發數據
  • 通信信道可以是無線的也可以是有線的

數據包就是主機之間傳遞的信息,是字節序列,由程序構建和解釋。數據包不僅有數據,還有包頭包含一些轉發所用的控制信息。

協議是數據包交換時程序的一些約定,主要是解析數據包的控制包頭信息。協議是分層的,常見的也是事實標準是TCP/IP。

應用程序、協議和Socket API三者關係如下圖,注意Socket的位置。
A TCP/IP network
網絡層,IP協議提供的是數據報服務(datagram service),使用了分組交換,每一個packet單獨處理、發送。但是請注意,IP是一個best-effort協議,盡力而爲的host-to-host服務,可能出現包丟失、包亂序、包重複的現象,這需要上層協議來解決。

傳輸層,有兩種協議,可靠有連接字節流的TCP和不可靠無連接數據報的UDP。兩者共同點是都使用了端口號(port number)來定位主機上的應用程序,提供的是end-to-end服務。TCP需要三次握手、四次揮手,使用TCP某種情形有點像文件I/O。但是使用UDP的應用程序需要自己來處理IP的三個問題。

2 關於地址(address)

通信之前必須知道對方的地址,就像郵局送信一樣,知道了地址才能投遞出去。確定網絡中某個應用程序的位置,需要三個信息:IP地址、端口號和傳輸協議。

IP地址有兩種:IPv4和IPv6。

2.1 IP地址格式

IPv4使用32位(bit)地址,常見寫法是點分十進制。如10.1.2.3。IPv6是128位地址,通常使用32個16進制數(hex)來表示,如2000:fdb8:0000:0000:0001:00ab:853c:39a1,中間的0可以省略,但是隻能省略一次,如果多個地方省略了0,就無法判斷到底是省略了幾個0,上述地址等價於2000:fdb8::1:ab:853c:39a1

2.2 IPv4和IPv6共存

現在處於IPv4向IPv6的過渡時期,但是怪異的是,IPv6和IPv4不兼容,常見的過渡手段:雙棧、隧道和翻譯【這是我知道的補充知識】。雙棧就是IPv4和IPv6兩個協議棧共存。這是最簡單的方法,但是IPv4和IPv6沒法通信,各走各的路罷了。隧道得名於英吉利海峽的海底隧道,就是把汽車放在火車上過海底隧道,這裏是IPv6-in-IPv4或者IPv4-in-IPv6。翻譯是清華大學李星老師力推的。還有IPv4映射到IPv6,使用::ffff:IPv4 address,這種寫法很怪異,前面是hex,後面IPv4地址是點分十進制。

2.3 端口號

TCP和UDP都有端口號,端口號是確定主機上的應用程序的。端口號是16位無符號二進制數,共有65536個端口號,其中0是保留端口號,0~1023是系統端口(System Port),端口號從1024—49151是被註冊的端口,也稱爲用戶端口(User Port),後面49152~65536是動態分配的1,具體的分配用途參加RFC6335。

2.4 特殊地址

  • 本地迴環地址(Loopback Address),分配給虛擬設備,迴環接口,發出去的數據會再發給本機,用於測試IP協議安裝正確性,即便沒有網卡也可以使用。IPv4是127.0.0.1,IPv6是0:0:0:0:0:0:0:1,或簡寫::1
  • IPv4的私有地址(Private Address),10.0.0.0/8172.16.0.0/12192.168.0.0/16。對於NAT地址轉換未嘗不是一件好事。
  • 鏈路本地地址(Link-local Address),也稱自動配置(autoconfigration)地址。 它僅供於在網段,或廣播域中的主機相互通信使用,路由器也不會轉發這類地址。這類主機通常不需要外部互聯網服務,僅有主機間相互通訊的需求。IPv4是169.254.0.0/16,IPv6是FE80::/10開頭的地址。
  • 多播(組播)地址(Multicast Address)。IPv4是224.0.0.0/24,IPv6是FF00::/120

3 關於名字(Name)

網絡協議處理的是地址,而非名字。地址是二進制數,而名字是字符串,顯然使用名字更方便(基於這個原因出來了NDN網絡嗎[smile cry])。從名字到地址的轉換使用了DNS(Domain Name System,域名系統)。

4 C/S架構

客戶端程序發起通信請求,服務端程序被動(passively)等待並響應請求。【其實就是請求響應模型了】客戶端需要知道服務器端的IP地址和端口號才能發起請求,而服務器端收到請求也便知道了客戶端的IP地址和端口號。

IP地址一般是通過統一資源定位符(Universal Resource Locator,URL)並結合名字服務知道的。端口號則是由IANA(Internet Assigned Number Authority)分配的1

還有一種架構是peer-to-peer(P2P),【B/S是C/S的一種】,但是這種架構按我理解其實也是一種極端的C/S,一個peer既是server,也是client。

5 什麼是Socket

Socket其實最早叫做Berkeley Socket出現於Unix系統上,簡稱Socket,是應用程序收發數據的一種抽象手段,和打開文件操作,允許程序讀寫一樣,畢竟Unix哲學:“一切都是文件”嘛。Socket也是一種文件。

不同的協議棧有不同的Socket,這裏只關注TCP/IP協議棧。這裏的Socket分爲Stream Socket,以及Datagram Socket。前者使用TCP,後者使用UDP。

Sockets,protocols,and ports
上圖描述了應用程序、Socket、協議、端口號以及主機之間的邏輯關係。

參考


  1. Service Name and Transport Protocol Port Number Registry ↩︎ ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章