天天看點

unix網絡程式設計1 基礎知識Introduction基礎知識

Introduction

    1. 通過學習unix網絡程式設計,在不使用任何庫隻使用api的情況下實作一個内置lua解釋器的web伺服器,實作簡單的業務邏輯,比如通過cgi模式在web浏覽器中顯示圖檔,播放視訊,可以在不重新開機伺服器的情況下更新業務邏輯。
    1. 主要是學習unix網絡程式設計做的筆記,其中将插入網絡程式設計

      的基礎知識,會有多程序版,I/O複用,多線程版本,每個web

      伺服器的吞吐量,并發連接配接數我都會有測試,最後會有對比圖。

基礎知識

  • 要編寫計算機網絡通信程式,首先要确定的就是通信的協定(protocol)。一般認為web伺服器是一個長時間運作的程式(deamon),它隻是在響應來自網絡的請求時才發送網絡資訊。協定的另外一端就是web客戶程式,如某種浏覽器。一般來說都是用戶端向服務端發消息,服務端就一直等着。也有伺服器向客戶發起請求的異步回調(asynchronous callback)通信,但是一般還是如下圖的用戶端/伺服器模式。
unix網絡程式設計1 基礎知識Introduction基礎知識
  • 多個客戶向一個伺服器發送請求
unix網絡程式設計1 基礎知識Introduction基礎知識
  • web用戶端和伺服器使用TCP(Transmission Control Protocol,傳輸控制協定)通信。TCP又轉而使用IP(Internet Protocol,網際協定)通信,IP通過鍊路層通信。下圖表示通信層次【區域網路的情況】.
    1. 觀察到雖然應用層是使用某種應用通信協定,比如FTP,HTTP。傳輸層都是是使用TCP協定。
    2. 下圖又展現了客戶/服務端資訊流的傳送方向,客戶把資訊從上到下通過鍊路層傳送到伺服器端,服務端從鍊路層讀取一直到應用層。
unix網絡程式設計1 基礎知識Introduction基礎知識
  • 如果客戶/服務端要在廣域網通信則需要使用路由器。如下圖
unix網絡程式設計1 基礎知識Introduction基礎知識
  • OSI模型

    下圖所示,我們隻關心傳輸層,以及資料鍊路層1500字資料限制,其他層都可以不管。

unix網絡程式設計1 基礎知識Introduction基礎知識
  • 下面隻介紹TCP,不介紹UDP,UDP相關資料請參考unix網絡程式設計相關章節。TCP是一個複雜的、可靠的位元組流協定。

    UDP不提供确認,序列号,逾時,重傳,RTT估算等機制。

    1. TCP提供客戶與伺服器之間的連接配接(connection),用戶端先和伺服器建立連接配接,連接配接之後才能交換資料,最後連接配接終止。
    2. TCP提供可靠性,當TCP發資料要求對端要發送一個确認。如果沒有收到資料就會重傳資料,并且等待比上一次更長的時間[這個有算法計算往返時間(round-trip time,RTT),多次失敗以後才放棄。

      [注意TCP傳送的資料不能保證100%正确,它隻能保證用戶端收到了沒有,不保證正确性]

    3. TCP給每一個位元組一個序号,對發送的資料進行排序。通過這種方式TCP接收端可以對亂序的資料根據序号進行排序,如果有一個位元組是重複的(因為網絡擁堵的情況重傳了資料),接收端就可以通過相同的序号丢棄掉這個位元組
    4. TCP提供流量控制(flow control).TCP會告訴對端任何時刻能夠可以接收的資料有多少,這個叫做通知視窗(advertised window).任何時刻視窗接收緩沖區能夠接收多少資料。
    5. TCP是全雙工(full-duplex)的,既可以發資料,又可以接收資料,而且為每一個資料流方向都提供,流量控制,跟蹤序列号等。
  • TCP的建立
  • 三路握手
    1. 服務端被動打開(passive open),通過調用socket、bind、listen三個函數來完成。
    2. 用戶端主動打開(active open),通過調用connect函數來完成,這會導緻TCP發送一個SYN分節(分節裡面含有連接配接建立以後傳送資料的初始序号)
    3. 伺服器必須确認(ACK)客戶的SYN,并且它也發送一個SYN(裡面含有服務端在連接配接建立以後發送第一個位元組資料的序号)
    4. 客戶必須确認服務端的SYN。

      這種交換至少需要三個分組,是以稱為三路握手(three-way handshake),下圖表現三路握手

      下圖中客戶的初始序号是J,伺服器的初始序号是K,ACK是下一次希望接受的序号。SYN和FIN都占了一個位元組,是以ACK要加1。

      注:分節是什麼?

      網絡各層是交換的資訊機關是協定資料單元(protocol data unit,PDU),分節(segment)就是對應與TCP傳輸層的PDU。分節的長度是有限的。每個分節所封裝的資料可以是應用程序的位元組流資料(就是tcp通過輸出操作寫到套接字中的資料),按順序封裝後傳送給TCP接收端。下面這兩劇很重要請注意,就是每個分節所封裝的由應用程序的資料可能不完整,這取決于,對端所告知的最大分節大小,下面會講,以及鍊路層的外出接口最大傳輸單元(MTU).ip層(ipv4)所接收的最大資料為65535位元組,是以運輸層的資料不能超過這個數,還有傳達鍊路層超過1500位元組會分片。

unix網絡程式設計1 基礎知識Introduction基礎知識
  • TCP選項
    1. MSS選項。通知對端它的最大分節大小(maximum segment size),發送端使用接收端的MSS值作為所發分節的最大大小。
    2. 視窗規模選項。TCP連接配接通知對端的最大視窗是65535
  • TCP連接配接終止

    TCP連接配接終止需要四個分節

    1. 應用程序主動關閉(active close),調用close函數實作,該端的TCP發送一個FIN分節,表示資料發送完畢。
    2. 接收端接收了這個FIN分節就會進行被動關閉(passive close),TCP還要給發送端一個确認。FIN放在排隊的資料後面,作為一個檔案結束符(end-of-file)傳遞給應用程序,對端接收到FIN以後就沒資料讀了。
    3. 一段時間後收到檔案描述符的應用程序也會調用close函數這也會導緻它的TCP向發送方發FIN分節。
    4. 接收到第二個FIN分節,發送端再确認這個分節。

      注意:第二步和第三部在FIN分節一起發送的時候就合并為一步。

      下圖展示TCP連接配接終止

unix網絡程式設計1 基礎知識Introduction基礎知識
  • TCP狀态轉換圖 TCP建立連接配接和連接配接終止

    黑線表示客戶正常狀态轉換

    虛線表示伺服器正常狀态轉化

unix網絡程式設計1 基礎知識Introduction基礎知識
  • 下圖是一個從開始建立連接配接,訓示對端分節大小,服務端可以接收單個分節的最大大小是1460位元組,用戶端是536位元組。建立連接配接就可以發送資料了,最後結束是四個分節。
unix網絡程式設計1 基礎知識Introduction基礎知識
  • 端口号

    使用端口号來區分程序。

    唯一表示一台伺服器,用戶端通過衆所周知端口号(well-konwn port)。

    用戶端使用創輸層臨時配置設定的端口号。

  • 套接字對

    TCP連接配接的兩端的端口号+ip位址

  • TCP端口号和并發伺服器

    并發伺服器通過主伺服器派生子程序處理新的連接配接.

    比如在freebsd上啟動一個伺服器,端口号21,該主機多宿,ip位址12.106.32.254和192.168.42.1.伺服器被動打開使用{* : 21,* : },伺服器在任意本地接口(第一個 ),21端口号等待連接配接,這個稱其為監聽套接字,後面外地位址是用接收任意位址的客戶的通路,是以用 * 表示.當伺服器接收客戶連接配接時,将連接配接交給子程序處理.連接配接建立後要把已連接配接套接字填入.

    unix網絡程式設計1 基礎知識Introduction基礎知識
  • 并發伺服器讓子程序處理客戶
    unix網絡程式設計1 基礎知識Introduction基礎知識
  • 處理第二個客戶,TCP客戶主機第二個客戶配置設定的端口号是1501
    unix網絡程式設計1 基礎知識Introduction基礎知識
  • 緩沖區大小

    ipv4定義了最小重組緩沖區大小(minimum reassembly buffer size),支援最小資料報大小是576位元組.

    MSS最大值為65535

    以太網使用ipv4最大1460(tcp首部20位元組,ipv4首部20位元組)

    下面是重點注意

    每一個TCP套接字都有一個發送緩沖區,當某個應用程序調用write,核心從該應用程序複制資料到發送緩沖區,如果發送緩沖區放不下,應用程序進入睡眠.假設該套接字是阻塞的,核心不從write系統調用傳回,直到應用程序緩沖區所有資料都複制到套接字發送緩沖區.從write傳回僅僅表示應用程序資料複制到套接字發送緩沖區,并不表示對端接收到資料.

    unix網絡程式設計1 基礎知識Introduction基礎知識

繼續閱讀