tcp ip高效編程 筆記

CS架構與對等實體

CS位置 備註 特色 舉例
同一機器 數據會被環回,並不會放到網絡設備輸出隊列中 幾乎沒有網絡延遲和丟包 本身開發web程序調試
同一局域網內 極少沒有網絡延遲和丟包 打印機
不一樣網絡 位於廣域網 途徑的路由器若是隊列空間耗盡,就會致使丟棄分組,進而致使重傳。重傳又會引發分組的重複和亂序。 真實環境

基本套接字API回顧

SOCKET socket (int domain, int type, int protocol)
// 成功返回套接字描述符,失敗時返回-1

套接字API與協議無關。web

domain是個常量,表示通訊域,有如下兩個算法

  • AF_INET 用於因特網
  • AF_LOCAL 用於同一臺機器上的IPC通訊,即進程間通訊

type說明套接字的類型,有常見的如下幾種編程

  • SOCK_STREAM 提供可靠,全雙工,面向鏈接的字節流,例如TCP
  • SOCK_DGRAM 提供不可靠,盡力而爲的數據服務,例如UDP
  • SOCK_RAW 容許對IP層的某些數據進行訪問,例如監聽ICMP報文

protocol說明使用哪一種協議,對tcp/ip來講,能夠直接由type字段隱式說明,參數被設置爲0windows

int connect (SOCKET s, const struct socketaddr *peer, int peer_len)
// 成功時返回0, 失敗時返回非0
  • s: 套接字描述符
  • peer: 是一個地址結構,存儲對等實體的地址和其餘信息
  • peer_len; 是地址結構的長度

connect一旦創建起來,就能夠傳輸數據。在unix中,套接字描述符能夠像文件描述符那樣調用read和write。可是windows安全

int recv (SOCKET s, void *buf, size_t len, int flags)
int rend (SOCKET s, cosnt void *buf, size_t len, int flags)

參數s, buf, len和read, write參數同樣。flags一般和系統有關。
unix和win都支持如下flag網絡

  • MSG_OOB 收發緊急數據
  • MSG_PEEK 查看輸入數據,可是不從緩衝區刪除數據。俗稱瞥一眼
  • MSG_DONTROUTE 繞過一般的選路函數,一般只有選路函數使用,或用於診斷

理解面向鏈接和無鏈接協議的區別

  • 面向鏈接和無鏈接,指的都是協議,不是物理介質,是指數據在介質上如何傳輸
  • 本質區別是,對於無鏈接協議,每一個分組的處理都是獨立的。對於面向鏈接的協議,分組還要維護後續分組的相關信息。
  • 無鏈接協議是面向鏈接協議的基礎

無鏈接協議就像是寄信,每封信都有本身的收件人地址,你能夠同時給多我的寄信。郵局處理信件也不會管每封信之間的關係。架構

面向鏈接的協議就像是打電話,一我的先撥號,等另外一我的說喂,而後本身在說我是某某某。說完話了,一我的會說,拜拜,另外一個也會說拜拜。 有時候你聽不清楚對方在說什麼,還會說:麻煩你在說一遍,我沒聽清。或者:你說的太快了,麻煩說慢一點。dom

--------
應用程序
--------
TCP和UDP
--------
  IP
--------
物理接口
--------

TCP的每一個分組成爲段(segment), 是放在IP數據包中發送的。可是IP數據報並不保證數據的可靠到達。因此TCP必須本身實現可靠性。socket

TCP使用三個功能實現可靠性tcp

  • 校驗和:校驗和用來校驗數據有沒有被中途損壞,保證安全性
  • 序列號:每一個段都有本身的序號,用來從新排列亂序的段,保證順序性
  • 確認重傳機制: 保證每一個段都被對方收到,保證可靠性

TCP的三個功能中,確認重傳機制最爲複雜。

TCP接收窗口

圖片描述

  • 左邊箭頭表示窗口的左邊界,所指望下一個字節的序列號
  • 右邊箭頭表示窗口的右邊界,表示TCP緩衝區所能容納字節的最大編號,用來防止緩衝區溢出
  • TCP到達時,全部序列號在窗口範圍以外的,都會被直接丟棄
  • 若是段中的第一個字節序號是指望的字節號,就通知應用程序有數據可讀。而且將窗口向右滑動

TCP發送窗口

圖片描述

  • 發送窗口分爲兩個部分,已經發送出的可是尚未收到確認的,還有能夠發送但尚未發送的
  • 在4-7字節已經發送出去以後,TCP會啓動一個RTO(retransmission timeout)超時重傳定時器,若是定時器超時以前這四個字節沒有被確認,就會重傳這四個字節。要注意重傳的本身能夠要比四個字節要多。
  • 重傳並不意味着數據沒有到達目的地,也有多是ACK丟失

TCP是一種流協議

TCP是一種流協議,並無固定的報文和報文流的概念。

發送兩次報文並不發送兩個獨立的實體,兩次調用send, 只是將數據交給底層TCP/IP棧。至於底層是如何發送這兩個數據的,由底層本身決定。

圖片描述

底層將數據發出去有不少決定因素

  • 發送窗口
  • 擁塞窗口
  • 路徑最大傳輸單元
  • 輸出隊列中有多少數據

圖片描述

不要低估TCP的性能

TCP並非絕對可靠

  • 故障模式
  • 對等實體崩潰
  • 網絡中斷

不要把OSI七層模型太當回事

實際上OSI模型由不少缺點,本質上說OSI協議已經停用了。OSI模型是理想,TCP/IP纔是現實。

理解TCP寫操做

  • 從應用程序角度看,send
  • 從TCP角度看,慢啓動,ng算法

TIME-WAIT

圖片描述

  • 一般,只有主動關閉鏈接的一方會進入TIME-WAIT階段
  • RFC 793將MSL定義爲兩分鐘,那麼2MSL就是4分鐘。實際的操做系統能夠將MSL設置爲更低的值,如30秒。
  • 若是鏈接處於TIME-WAIT階段,又有分組到達,就會重啓2MSL定時器。

使用TIME-WAIT的目的

  • 維護鏈接狀態,以防主動發起鏈接關閉的哪一方最後一個ACK丟失形成另外一端發送FIN
  • 耗盡網絡中全部此鏈接的走失提供時間

想想,若是主機1在發出ACK以後當即關閉了鏈接,會發生什麼事?

AB分別爲主機

有 TIME-WAIT狀態時,若是ACK丟失,那麼B會重發FIN, A處於TIME_WAIT階段時,再次收到FIN, 那麼就會再次發送ACK, 並重啓激動2MSL計時。

圖片描述

無TIME-WAIT狀態時, 主機A的收到FIN後,當即釋放端口,那麼該端口處於未監聽狀態。當數據被髮送到爲監聽的端口時,發送方會收到連接重置的報文。

圖片描述

無TIME-WAIT狀態時, 主機A的端口已經被新的應用程序佔用,新的鏈接的數據可能被遲來的數據破壞。

圖片描述

TCP的狀態轉移圖

  • TCP一共有11中狀態
  • 左下角虛線方框中是主動關閉方關閉時會經歷的狀態轉移

圖片描述

儘量寫入一個大塊數據,而不是頻繁的寫入小塊的數據

參考書籍

相關文章
相關標籤/搜索