a) 在編寫與計算機通訊的程序時,首先要肯定的就是和計算機通訊的協議,從高層次來肯定通訊由哪一個程序發起以及響應在合適產生。大多數網絡應用按照劃分紅客戶和服務器來組織。在設計網絡應用時,肯定老是由客戶發起請求每每可以簡化協議和程序自己。固然一個較爲複雜的網絡應用還須要異步回調通訊,也就是由服務器向客戶發起請求消息。web
i. 在本書原著上屢次提到客戶(client)和服務器(server)這兩個術語。可是他們在具體上下文的含義不一樣,有的是指靜態的程序(客戶程序和服務器程序),有的是指動態的進程(客戶進程和服務器進程),有時指運行進程的主機(客戶主機和服務器主機)。shell
ii.可認爲客戶與服務器之間是經過某個網絡協議通訊的,但實際上,這樣的通訊一般涉及到多個網絡協議層。本書的焦點是TCP/IP協議簇,也稱爲網際協議簇。舉例,WEB客戶與服務器之間使用TCP(Transmission Control Protocol,傳輸控制協議)通訊。TCP又轉而使用IP(InternetProtocol,網際協議)通訊,IP再經過某種形式的數據鏈路層通訊。編程
儘管客戶與服務器之間使用某個應用協議通訊,傳輸層卻使用TCP通訊。數據流的流向在一端從上到下,在另外一端從下到上。一般,客戶和服務器一般是用戶進程,瀏覽器
而TCP和IP協議一般是內核中協議棧的一部分。其中七層OSI模型(物理層、數據鏈路層、網絡層、傳輸層、表示層、會話層、應用層)。服務器
上圖講述的是處於同一個局域網裏的通訊狀況,在不一樣局域網的狀況是:經過路由器鏈接到廣域網。(路由器是廣域網的架構設備)網絡
關於結構體struct sockaddr,也就是經過套接字地址結構,每當一個套接字函數須要一個指向某個套接字地址結構的指針時,這個指針必須強制類型轉換成一個指向經過套接字地址結構的指針。 架構
本章在舉例說明的時候,使用了獲取時間的服務器函數之類的東西,這是一個函簡單的程序,按照的基本的TCP客戶/服務流程交互,在服務端在填寫字符的時候使用了函數snprintf,這個函數和sprintf的功能類似。調用sprintf沒法檢查目的緩衝區是否溢出。Snprintf要求其第二個參數指定目的緩衝區的大小,所以可確保該緩衝區不溢出。併發
單個處理一個客戶的服務器程序稱爲迭代服務器,由於對於每一個客戶它都迭代執行一次。同時能處理多個客戶的稱爲併發服務器。框架
下面是客戶程序的main函數:異步
這裏使用最標準的客戶程序:初始化、鏈接、處理(和服務器使用字節流/數據報交互),裏面使用的函數的做用和使用方法在後續章節都會陸續講解。
其中最後一行的語句exit是程序退出,UNIX在一個進程終止時老是關閉該進程全部打開的描述符,咱們的套接字描述符也就此關閉。
在使用read時,若果返回爲0,那麼說明對端已經關閉鏈接,若是返回值爲負值,那麼說明出現錯誤。還須要細細揣摩這句哈:TCP是一個沒有邊界的字節流協議。、
計算機網絡各對等實體間交換的單元信心稱爲協議數據單元(protocol data unit PDU),分節(segment)就是對應於TCP傳輸層的PDU.按照協議與服務之間的關係,除了最底層物理層外,每層的PDU經過由緊鄰下層提供給本層的服務接口,做爲下層的服務數據單元傳遞給下層…………
應用層實體(如客戶或服務器進程)間交換的PDU稱爲應用數據,其中在TCP應用進程之間交換的是沒有長度限制的單個雙向字節流,在UDP應用進程之間交換的是其長度不超過UDP發送緩衝區大小的單個記錄,在SCTP應用進程之間交換的是沒有總長度顯示的單個或多個雙向字節流。傳輸層實體(對應某個端口的傳輸層協議代碼的一次運行)間交換的PDU稱爲消息,其中TCP的PDU特稱爲分節。消息或分節的長度是由限的。在TCP傳輸層中,發送端TCP把來自應用進程的字節流數據(既由應用進程經過一次輸出操做寫出到發送端TCP套接字中的數據)按順序經分割後封裝在各個各個分節中傳送給接受端TCP其中每一個分節所封裝的數據既多是發送端應用進程單詞操做的結果,也多是連續數次輸出操做的結果,具體取決於可在連續創建階段由對端通告的最大分節大小(maximum segmen size MSS)以及外出接口的最大傳輸單元(maximumtransmission unit MTU)或外出路經的路徑MTU(若是網絡層具備路徑MTU發現功能)。分節除了用於承載應用數據外,也用於創建鏈接(SYN分節)、終止鏈接(FIN分節)、停止鏈接(RST分節)、確認數據接收(ACK分節)刷送待發數據(PSH分節)和攜帶緊急數據指針(URG分節),並且這些功能(包括承載數據)能夠靈活組合。UDP傳輸層至關簡單,發送端UDP就把倆字應用進程的單個記錄整個封裝在UDP消息中傳送給接受端UDP。SCTP引入了稱爲塊的數據單元,SCTP消息就由一個公共首部加上一個或多個塊構成,公共首部相似UDP消息的首部,僅僅給出源目的端口和整個SCTP消息的校驗和,塊則可既能夠承載數據,也能夠承載控制信息。
網絡層實體間的PDU稱爲IP數據報(IPdatagram),其長度有限:Ipv4數據報最大65535字節,Ipv6數據報最大65575字節。發送端IP把來自傳輸層的消息(或TCP分節)整個封裝在IP數據報中發送。鏈路層實體間交換的PDU稱爲幀,其長度取決於具體的接口。IP數據報由IP首部和所承載的傳輸層數據(既網絡層的SDU,由上面的定義能夠看出來,上層的PDU也就是下層的SDU,因此這裏也可認爲是傳輸層傳遞的消息或者分節)構成。過長的IP數據報沒法封裝在單個幀中,須要先對其SDU進行分片,再把分紅的各個片斷冠以新的IP首部封裝到多個幀中。在一個IP數據報從源到目的端的傳送過程當中,分片操做既可能發生在源端,也可能發生在途中,而其逆操做爲重組。
TCP/IP協議簇爲提升效率會盡量避免IP的分片/重組操做,TCP根據MSS和MTU限定每一個分節的大小以及SCTP根據MTU分片/重組過長記錄都是這個目的。不管是否分片,都由IP做爲鏈路層的SDU傳輸鏈路層,並由鏈路層封裝在幀中的數據稱爲分組(俗稱包)可見一個分組既多是一個完整的IP數據報,也多是某個IP數據報的SDU的一個片斷被冠以新的IP首部後的結果。文中討論的MSS是應用層(TCP)與傳輸層之間的接口屬性,MTU則是網絡層和鏈路層之間的接口屬性。
遵循了服務器程序的流程:初始化、綁定、監聽、接受、處理(和客戶進行交互)
程序中的函數在後續章節有講解。
網絡層由IPv4和IPv6這兩個協議處理,能夠選擇的傳輸層有TCP或UDP,在上圖中TCP與UDP之間留有間隙,代表網絡應用繞過傳輸層直接使用IPv4或IPv6是可能的,這就是所謂的原始套接字。
OSI模型的頂上三層被合併成一層,稱爲應用層。這就是web客戶(瀏覽器)、telnet客戶、web服務器、ftp服務器和其其餘咱們在使用的網絡應用所在的層。對於網際協議,OSI模型的頂上三層協議幾乎沒有區別。
在這一系列的講述中,套接字編程接口是從頂上三層(網際協議的應用層)進入傳輸層的接口。全部文章的焦點是:如何使用套接字編寫使用TCP或UDP的網絡應用程序。
1) netstat netstat –i提供網絡接口的信息。咱們還指定-n標誌以輸出數值地址,而不是試圖把他們反響解析成名字。
2) netstat –r 展現路由表
這一章中主要講解了和基本的信息,從宏觀上講解了本書的大致框架
UNIX系統中程序和進程是在系統調用上exec上銜接的。exec既能夠由shell隱式調用(直接在shell輸入命令執行程序屬於這種狀況),也能夠在用戶程序中顯示調用。
從上層到下層的PDU(協議數據單元)的名字爲:應用數據,消息/分節(TCP協議特有的)、幀、分組(俗稱包)
關於UNIX中的errno的值:
只要一個UNIX函數(例如某個套接字函數)中有錯誤發生,全局變量errno就被置爲一個指明錯誤類型的正直,函數自己則經過返回-1.err_sys查看errno變量的值並輸出響應的出錯消息,例如errno=ETIMEDOUT,輸出爲「Connection timed out」
在全局變量中存放errno值對於共享全部全局變量的多個線程並不合適,在26章有講解
若是想要了解紅字及其下面的部分就須要看做者的另一本書了:TCP/IP詳解
轉載請標明出處