深入理解計算機系統:網絡編程 上

一直以來對計算機網絡比較感興趣,但是無奈大學計算機網絡的學習非常表面,已經忘得差不多了。畢業後讀了一些網絡方面的書,對網絡知識的冰山一角有了一些感悟。
隨着網絡方面的書越讀越多,不懂的地方也越來越多。而且很多知識不經常使用,沒多久就網絡。
so,我決定着手自己寫一個web服務器。哇,居然沒什麼頭緒。

第一步,我先閱讀了下深入理解計算機系統的網絡編程這一章。以下就是我在閱讀過程中記錄的精華。

11章 網絡編程

11.1 c-s模型

服務器管理某種資源,爲客戶端提供某種服務。例如,web服務器管理一些磁盤文件,它代表客戶端進行檢索和執行。
c,s是進程,而非主機或者機器。

11.2 網絡

對於主機,網絡是一個I/O設備。
一個網絡通過網絡適配器連接到I/O總線擴展槽,從網絡上接受的數據通過網絡適配器經過I/O和存儲器總線拷貝到了存儲器,典型地通過DMA傳送。
類似,數據也能通過存儲器拷貝到網絡。

(這本書太牛逼了,這一章簡直精簡地概括了我所瞭解的網絡知識,並且對我迷惑的很多地方都進行了闡釋)

主機連接到集線器,網橋連接多個網段成爲一個更大的局域網(橋接以太網)。多個不兼容的網絡可以通過路由器連接,組成一個internet.
Internet:具體,全球IP因特網;internet:抽象,一個網絡概念

WAN:廣域網 LAN:局域網

互聯網重要特性:他能由採用完全不同和不兼容技術的的各種局域網和廣域網組成。那麼,
這些不同的網絡之間如何進行溝通呢?協議軟件。

協議軟件實現一種協議,控制主機和路由器如何協同工作來實現數據傳輸。
協議必須實現兩個功能:
命名機制。爲主機分配一個互聯網絡地址,唯一標識這臺主機。
傳送機制。定義一種能夠將來自不同協議的不同格式的幀封裝成不連續的片(包)。一個包由包頭和有效荷載組成。包頭包括包的大小以及源目地址。

11.3 全球IP因特網

TCP/IP 是一個協議族,IP提供基本的命名方法和傳送機制、UDP擴展了IP協議,可以在進程間而不是主機間傳送、TCP基於IP實現了進程間可靠的全雙工連接。

因特網是一個世界範圍內的主機集合:
主機集合被映射爲一組32位的IP地址
IP地址被映射爲因特網域名的標識符
因特網主機上的進程能夠通過連接(connection)和其他任何因特網主機上的進程通信

因特網主機可以有不同的主機字節順序,所以TCP/IP爲任意整數數據定義了統一的網絡字節順序(大端字節順序),
unix提供了函數能夠讓數據在大小端之間轉換:htonl, htons, ntohl, ntohs

inet_aton, inet_ntoa可以實現IP地址和點分十進制串之間的轉換
n:network a: application

因特網域名
因特網定義了域名集合和IP地址集合之間的映射。
DNS數據庫上的主機條目結構定義了一組域名和一個官方名字和一組別名和一組IP地址之間 的映射。
gethostbyname返回和域名name相關的主機條目;gethostbyaddr返回和IP地址相關聯的主機條目

因特網連接
一個套接字是一個連接的端點。每個套接字都有對應的套接字地址,由一個因特網地址和一個端口組成,用“地址:端口”組成。
客戶端發起連接時,端口號是內核分配的,稱爲臨時端口;在服務器端,端口是固定的,對應系統上不同的服務。
一個連接由它兩端的套接字地址唯一確定。(套接字對)

11.4 套接字接口

套接字接口是一組函數,它們和unix IO函數結合起來,用來創建網絡應用。

套接字地址結構
從內核來看,套接字就是通信的一個端點。從程序來看,套接字就是一個有相應描述符的打開文件。
tcp/ip的套接字相關代碼中,_in後綴意思是互聯網絡(internet),而不是輸入。

socket函數
客戶端和服務器使用socket函數來創建一個套接字描述符。
通常帶這樣的參數:
clientfd = Socket(AF_INET, SOCK_STREAM, 0);
AF_INET表明我們正在使用因特網,SOCK_STREAM表明這個套接字是因特網連接的一個端點。clientfd僅僅部分打開,還不能讀寫。如何完成打開套接字,取決於是客戶端還是服務器。

connetc函數
客戶端使用connect來建立和服務器的連接。

=============== 未完待續 =================

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