unix網(wǎng)絡(luò)編程概述

客戶與服務(wù)器之間使用某個(gè)應(yīng)用協(xié)議通信,傳輸層使用TCP通信。客戶與服務(wù)器之間信息流在其中一端是向下通過協(xié)議棧,跨越網(wǎng)絡(luò)后,另一端是向上通過協(xié)議棧??蛻艉头?wù)器是用戶進(jìn)程,TCP和IP協(xié)議是內(nèi)核中協(xié)議棧的一部分。

描述一個(gè)網(wǎng)絡(luò)中各個(gè)協(xié)議層常用方法是使用國際標(biāo)準(zhǔn)化組織(ISO)的計(jì)算機(jī)通信開放系統(tǒng)互連,7層模型
設(shè)備驅(qū)動(dòng)程序和硬件:物理層、數(shù)據(jù)鏈路層,網(wǎng)絡(luò)層:IPv4,IPv6,傳輸層:TCP,UDP,應(yīng)用層:會(huì)話層、表示層、應(yīng)用層

一、POSIX發(fā)展歷史

POSIX可移植操作系統(tǒng)接口,發(fā)展簡史

  • 第一個(gè)POSIX標(biāo)準(zhǔn)詳述了進(jìn)入類Unix內(nèi)核的C語言接口,涵蓋了下述領(lǐng)域:進(jìn)程原語(fork,exec,信號,定時(shí)器)、進(jìn)程環(huán)境(用戶ID和進(jìn)程組)、文件與目錄(所有I/O函數(shù))、終端I/O、系統(tǒng)數(shù)據(jù)庫(口令文件和用戶組文件)以及star和cpio歸檔格式
  • 第二個(gè)做了少量修改,新添副標(biāo)題為C語言API
  • 第三個(gè)版本新添shell和100個(gè)實(shí)用程序,通常從shell啟動(dòng)執(zhí)行程序,如awk、basename、vi和yacc等
  • 第三個(gè)版本新增線程的內(nèi)容,線程同步(互斥鎖和條件變量)、線程調(diào)度和同步調(diào)度
  • 第四個(gè)定義兩個(gè)API,簡稱網(wǎng)絡(luò)結(jié)論DNI/Socket(基于BSD的套接字API),DNI/XTI(基于X/Open的XPG規(guī)范)

二、傳輸層:TCP、UDP和SCTP

協(xié)議 描述
IPv4 網(wǎng)際協(xié)議版本4,使用32位地址,IPv4給TCP,UDP,SCTP,ICMP和IGMP提供分組遞送服務(wù)
IPv6 國際協(xié)議版本6,使用128位更大地址應(yīng)對20世紀(jì)90年代因特網(wǎng)爆發(fā)性增長,IPv6為TCP、UDP、SCTP和ICMPv6提供分組遞送服務(wù)。當(dāng)無需區(qū)別IPv4和IPv6時(shí),經(jīng)常把IP一次用作形容詞使用,如IP層、IP地址
TCP 傳輸層協(xié)議,面向連接斜體,為用戶提供可靠全雙工字節(jié)流,TCP套接字是流套接字,關(guān)心確認(rèn)、超時(shí)、重傳之類的細(xì)節(jié)
UDP 用戶數(shù)據(jù)報(bào)協(xié)議,無連接協(xié)議,數(shù)據(jù)報(bào)套接字,不能保證最終達(dá)到目的地
SCTP 流傳輸協(xié)議,可靠雙工關(guān)聯(lián)面向連接協(xié)議,多宿的,每個(gè)關(guān)聯(lián)的兩端均涉及一組IP地址和一個(gè)端口號,提供消息服務(wù),維護(hù)來自應(yīng)用層的記錄邊界

1.用戶數(shù)據(jù)協(xié)議UDP

應(yīng)用進(jìn)程往一個(gè)UDP套接字寫入一個(gè)消息,消息被封裝到一個(gè)UDP數(shù)據(jù)報(bào),UDP數(shù)據(jù)報(bào)被封裝到IP數(shù)據(jù)報(bào),然后發(fā)送到目的地。UDP不保證UDP數(shù)據(jù)報(bào)會(huì)到達(dá)最終目的,不保證各個(gè)數(shù)據(jù)報(bào)先后順序跨網(wǎng)絡(luò)后保持不變,也不保證每個(gè)數(shù)據(jù)報(bào)只到達(dá)一次。

每個(gè)UDP數(shù)據(jù)報(bào)都有一個(gè)長度,如果一個(gè)數(shù)據(jù)報(bào)正確地到達(dá)目的地,該數(shù)據(jù)報(bào)的長度將隨數(shù)據(jù)一道傳遞給接收端應(yīng)用進(jìn)程。

UDP提供無連接服務(wù),UDP客戶與服務(wù)器之間不必存在長期的關(guān)系,一個(gè)UDP客戶可以創(chuàng)建一個(gè)套接字并發(fā)送一個(gè)數(shù)據(jù)報(bào)給一個(gè)給定的服務(wù)器,然后立即有同一個(gè)套接字發(fā)送另一個(gè)數(shù)據(jù)報(bào)給另一個(gè)服務(wù)器。同樣的,一個(gè)UDP服務(wù)器可以用同一個(gè)UDP套接字從若干不同客戶接受數(shù)據(jù)報(bào),每個(gè)客戶一個(gè)數(shù)據(jù)報(bào)

2.傳輸控制協(xié)議(TCP)

TCP客戶先與某個(gè)給定的服務(wù)器建立一個(gè)連接,再跨越連接與那個(gè)服務(wù)器交換數(shù)據(jù),然后終止這個(gè)連接。

TCP提供可靠性,當(dāng)TCP向另一端發(fā)送數(shù)據(jù)時(shí),它要求對端返回一個(gè)確認(rèn)。如果沒有收到確認(rèn),TCP自動(dòng)重傳數(shù)據(jù)并等待更長時(shí)間,在數(shù)次重傳失敗后,TCP才會(huì)放棄,如此在嘗試發(fā)送數(shù)據(jù)上所花總時(shí)間一般為4-19分鐘

TCP含有用戶動(dòng)態(tài)估算客戶和服務(wù)器之間的往返時(shí)間(RTT)算法,等待一個(gè)確認(rèn)需要多長時(shí)間。RTT在一個(gè)局域網(wǎng)上大約幾毫秒,跨越一個(gè)廣域網(wǎng)可能數(shù)秒鐘,RTT受網(wǎng)絡(luò)流通各種變化因素,TCP還持續(xù)估算一個(gè)給定連接的RTT。

TCP通過給其中每個(gè)字節(jié)關(guān)聯(lián)一個(gè)序列號對所發(fā)送的數(shù)據(jù)進(jìn)行排序。假設(shè)一個(gè)應(yīng)用寫2048字節(jié)到一個(gè)TCP套接字,導(dǎo)致TCP發(fā)送2個(gè)字節(jié);第一個(gè)字節(jié)所含數(shù)據(jù)序列號11024,第二個(gè)字節(jié)所含數(shù)據(jù)序列號10252018。如果這些分節(jié)非順序達(dá)到,接收端TCP將先根據(jù)它們的序列號重新排序,再把結(jié)果數(shù)據(jù)傳遞應(yīng)用,重復(fù)數(shù)據(jù)也如如此處理。

TCP提供流量控制,TCP總是告知對端在任何時(shí)刻它一次能夠從對端接受多少字節(jié)的數(shù)據(jù),稱為通告窗口。在任何時(shí)刻,該窗口指出接受緩沖區(qū)中當(dāng)前可用的空間量,從而確保發(fā)送端的數(shù)據(jù)不會(huì)使接受緩沖區(qū)溢出。該窗口時(shí)刻動(dòng)態(tài)變換。當(dāng)接受到來自發(fā)送端的數(shù)據(jù)時(shí),窗口大小減小,當(dāng)接受端應(yīng)用緩沖區(qū)中讀取數(shù)據(jù),窗口大小增大。當(dāng)TCP對應(yīng)某個(gè)套接字的接受緩沖區(qū)已滿,導(dǎo)致它必須等待應(yīng)用從緩沖區(qū)讀取數(shù)據(jù)時(shí),方能從端再接受數(shù)據(jù)。

TCP是全雙工,一個(gè)給定的連接上應(yīng)用可以在任何時(shí)刻在進(jìn)出兩個(gè)方向上既發(fā)送數(shù)據(jù)又接受數(shù)據(jù)。

三、TCP連接的建立與終止

1.三路握手

(1) 服務(wù)器必須準(zhǔn)備好接受外來的連接,調(diào)用socket、bind和listen這三個(gè)函數(shù)來完成,被動(dòng)打開
(2) 客戶通過調(diào)用connect發(fā)起主動(dòng)打開,導(dǎo)致客戶TCP發(fā)送一個(gè)SYN(同步)分節(jié),它告訴服務(wù)器客戶將在(待建立的)連接中發(fā)送數(shù)據(jù)的初始序列號。通常SYN分節(jié)不攜帶數(shù)據(jù),其所在IP數(shù)據(jù)報(bào)只喊一個(gè)IP首部,一個(gè)TCP首部及可能有的TCP選項(xiàng)
(3) 服務(wù)器只需確認(rèn)(ACK)客戶的SYN,同時(shí)自己也得發(fā)送一個(gè)SYN分節(jié),它含有服務(wù)器將在同一連接中發(fā)送的數(shù)據(jù)初始序列號。服務(wù)器在單個(gè)分節(jié)中發(fā)送SYN和對客戶SYN的ACK(確認(rèn))
(4) 客戶必須確認(rèn)服務(wù)器的SYN


三路握手.jpg

2.TCP選項(xiàng)

每一個(gè)SYN都可以含有多個(gè)TCP選項(xiàng),常用TCP選項(xiàng)

  • MSS選項(xiàng)。發(fā)送SYN的TCP一端視同本選項(xiàng)通告端告對端它的最大分節(jié)大小即MSS,也就它在本連接的每個(gè)TCP分節(jié)中愿意接受的最大數(shù)據(jù)量
  • 窗口規(guī)模選項(xiàng),TCP連接任何一端能夠通告對端的最大窗口大小是65535,在TCP首部中相應(yīng)的字段占16位,當(dāng)今因特網(wǎng)上已普及高速網(wǎng)絡(luò)連接,最大窗口接近1GB
  • 時(shí)間戳選項(xiàng)。對高速網(wǎng)絡(luò)連接是必要的,防止由失而復(fù)現(xiàn)的分組可能造成的數(shù)據(jù)毀壞。

3.TCP連接終止

TCP建立一個(gè)連接需3個(gè)分節(jié),終止一個(gè)連接需4個(gè)分節(jié)
(1)某個(gè)應(yīng)用進(jìn)程首先調(diào)用close,該端執(zhí)行主動(dòng)關(guān)閉,該端的TCP于是發(fā)送一個(gè)FIN分節(jié),表示數(shù)據(jù)發(fā)送完畢
(2) 接收到這個(gè)FIN的對端執(zhí)行被動(dòng)關(guān)閉,這個(gè)FIN由TCP確認(rèn)。它的接收也作為一個(gè)文件結(jié)束符(end-of-file)傳遞給接收端應(yīng)用進(jìn)程傳遞給接收端應(yīng)用進(jìn)程(放在億排隊(duì)等待應(yīng)用進(jìn)程接收的任何其他數(shù)據(jù)之后),因?yàn)镕IN的接收意味著端應(yīng)用進(jìn)程在相應(yīng)連接上再無額外數(shù)據(jù)可接收
(3) 一段時(shí)間后,接收到這個(gè)文件結(jié)束符的應(yīng)用進(jìn)程將調(diào)用close關(guān)閉它的套接字。導(dǎo)致它的TCP也發(fā)送一個(gè)FIN
(4) 接收這個(gè)最終的FIN原發(fā)送端TCP(執(zhí)行主動(dòng)關(guān)閉的哪一端)確認(rèn)這個(gè)FIN

每個(gè)方向都需要一個(gè)FIN和一個(gè)ACK,因此需要4個(gè)分節(jié)。


TCP連接關(guān)閉.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容