CS位置 | 備註 | 特色 | 舉例 |
---|---|---|---|
同一機器 | 數據會被環回,並不會放到網絡設備輸出隊列中 | 幾乎沒有網絡延遲和丟包 | 本身開發web程序調試 |
同一局域網內 | 極少沒有網絡延遲和丟包 | 打印機 | |
不一樣網絡 | 位於廣域網 | 途徑的路由器若是隊列空間耗盡,就會致使丟棄分組,進而致使重傳。重傳又會引發分組的重複和亂序。 | 真實環境 |
SOCKET socket (int domain, int type, int protocol) // 成功返回套接字描述符,失敗時返回-1
套接字API與協議無關。web
domain是個常量,表示通訊域,有如下兩個算法
AF_INET
用於因特網AF_LOCAL
用於同一臺機器上的IPC通訊,即進程間通訊type說明套接字的類型,有常見的如下幾種編程
SOCK_STREAM
提供可靠,全雙工,面向鏈接的字節流,例如TCPSOCK_DGRAM
提供不可靠,盡力而爲的數據服務,例如UDPSOCK_RAW
容許對IP層的某些數據進行訪問,例如監聽ICMP報文protocol說明使用哪一種協議,對tcp/ip來講,能夠直接由type字段隱式說明,參數被設置爲0windows
int connect (SOCKET s, const struct socketaddr *peer, int peer_len) // 成功時返回0, 失敗時返回非0
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網絡
瞥一眼
無鏈接協議就像是寄信,每封信都有本身的收件人地址,你能夠同時給多我的寄信。郵局處理信件也不會管每封信之間的關係。架構
面向鏈接的協議就像是打電話,一我的先撥號,等另外一我的說喂,而後本身在說我是某某某。說完話了,一我的會說,拜拜,另外一個也會說拜拜。 有時候你聽不清楚對方在說什麼,還會說:麻煩你在說一遍,我沒聽清。或者:你說的太快了,麻煩說慢一點。dom
-------- 應用程序 -------- TCP和UDP -------- IP -------- 物理接口 --------
TCP的每一個分組成爲段(segment), 是放在IP數據包中發送的。可是IP數據報並不保證數據的可靠到達。因此TCP必須本身實現可靠性。socket
TCP使用三個功能實現可靠性tcp
校驗和
:校驗和用來校驗數據有沒有被中途損壞,保證安全性序列號
:每一個段都有本身的序號,用來從新排列亂序的段,保證順序性確認重傳機制
: 保證每一個段都被對方收到,保證可靠性TCP的三個功能中,確認重傳機制最爲複雜。
TCP到達時,全部序列號在窗口範圍以外的,都會被直接丟棄
TCP是一種流協議,並無固定的報文和報文流的概念。
發送兩次報文並不發送兩個獨立的實體,兩次調用send, 只是將數據交給底層TCP/IP棧。至於底層是如何發送這兩個數據的,由底層本身決定。
底層將數據發出去有不少決定因素
實際上OSI模型由不少缺點,本質上說OSI協議已經停用了。OSI模型是理想,TCP/IP纔是現實。
使用TIME-WAIT的目的
想想,若是主機1在發出ACK以後當即關閉了鏈接,會發生什麼事?
AB分別爲主機
有 TIME-WAIT狀態時,若是ACK丟失,那麼B會重發FIN, A處於TIME_WAIT階段時,再次收到FIN, 那麼就會再次發送ACK, 並重啓激動2MSL計時。
無TIME-WAIT狀態時, 主機A的收到FIN後,當即釋放端口,那麼該端口處於未監聽狀態。當數據被髮送到爲監聽的端口時,發送方會收到連接重置的報文。
無TIME-WAIT狀態時, 主機A的端口已經被新的應用程序佔用,新的鏈接的數據可能被遲來的數據破壞。