- 1 網路,資料包,協議
- 2 關于地址(address)
- 2.1 IP地址格式
- 2.2 IPv4和IPv6共存
- 2.3 埠號
- 2.4 特殊地址
- 3 關于名字(Name)
- 4 C/S架構
- 5 什么是Socket
- 參考
1 網路,資料包,協議
計算機網路是多臺主機和路由器通過通信信道(communication channels)連接起來的,有三個物體:
- 主機,運行程式
- 路由器,轉發資料
- 通信信道可以是無線的也可以是有線的
資料包就是主機之間傳遞的資訊,是位元組序列,由程式構建和解釋,資料包不僅有資料,還有包頭包含一些轉發所用的控制資訊,
協議是資料包交換時程式的一些約定,主要是決議資料包的控制包頭資訊,協議是分層的,常見的也是事實標準是TCP/IP,
應用程式、協議和Socket API三者關系如下圖,注意Socket的位置,

網路層,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,使用::fff: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/8,172.16.0.0/12,192.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: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,

上圖描述了應用程式、Socket、協議、埠號以及主機之間的邏輯關系,
參考
Service Name and Transport Protocol Port Number Registry ?? ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/21184.html
標籤:其他
上一篇:決議幾何
下一篇:狂人日記
