傳輸層爲網絡應用程序提供了一個接口,而且可以對網絡傳輸提供了可選的錯誤檢測、流量控制和驗證功能。TCP/IP傳輸層包含不少有用的協議,可以提供數據在網絡傳輸所需的必要尋址信息。但尋址和路由只是傳輸層的部分功能。tcp/ip的開發者知道你他們須要在網際層上添加另一層,並經過這一層提供的額外必要特性來使用IP。傳輸層協議須要提供如下功能:html
最後一項是變化最多的。質量保證一般會在收益與代價之間尋找平衡。精心的質量保證系統會提升傳輸的可靠性,但須要以增長網絡流量和處理時間爲代價。對於大多數應用程序來講,這種額外的保證並不值得。所以傳輸層提供了兩種到達網絡的方式,他們都具備支持應用程序所必須的接口和多路複用/多路分解功能,但在質量保證方面所採用的方法有很大不一樣,以下所示:git
爲了針對不一樣狀況提供不一樣程序的質量保證,傳輸層提供了兩種不一樣的協議原型github
在TCP/IP系統中,應用程序能夠使用端口號經過TCP或UDP指定數據目的地。端口是一個預約義的內部地址,充當從應用程序到傳輸層或是從傳輸層到應用程序之間的通路。shell
進一步觀察傳輸層這種與應用程序相關的尋址體制,就會發現TCP和UDP數據實際是被髮送到一個套接字上的。套接字是一個由IP地址和端口號組成的地址。例如,套接字地址111.121.131.141.21
指向IP地址爲111.121.131.141的計算機的端口21。api
下面的例子裏展現了一臺計算機如何經過套接字訪問目的計算機上的一個應用程序。瀏覽器
服務 | TCP端口號 | 簡要描述 |
---|---|---|
tcpmux | 1 | TCP端口服務多路複用器 |
compressnet | 2 | 管理工具 |
ftp | 21 | 文件傳輸協議控制 |
ssh | 22 | 安全shell |
smtp | 25 | 簡單郵件傳輸協議 |
http | 80 | WWW服務 |
服務 | UDP端口號 | 簡要描述 |
---|---|---|
echo | 7 | 回顯 |
discard | 9 | 拋棄或空 |
domain | 53 | 域名服務程序(DNS) |
systat | 11 | 用戶 |
daytime | 13 | 時間 |
qotd | 17 | 每日引用 |
套接字尋址系統使得TCP和UDP可以執行傳輸層另外一個重要任務:多路複用和多路分解。多路複用是指多個來源的數據導向一個輸出,而多路分解是把一個來源接收的數據發送到多個輸出。緩存
多路傳輸/多路分解分解讓TCP/IP協議棧較低層的協議沒必要關心哪一個程序在傳輸數據。與應用程序相關的操做都由傳輸層完成了,數據經過一個與應用程序無關的管道在傳輸層與網際層之間傳遞。安全
多路複用和多路分解的關鍵在於套接字地址。套接字的地址包含了IP地址與端口號,爲特定計算機上的特定應用程序提供了一個惟一的標識。全部客戶端計算機使用熟知的TCP端口21鏈接到FTP服務器,但針對每臺我的計算機的目的套接字是不一樣的。相似地,運行於這臺FTP服務器上所有網絡應用程序都使用服務器的IP地址,但只有FTP服務程序使用由IP地址和TCP端口號21組成的套接字地址服務器
本章前面提到,TCP是個面向鏈接的協議,提供了全面的錯誤控制和流量控制。UDP是個無鏈接協議,錯誤控制也簡單得多。能夠這樣說,TCP是爲了可靠性,而UDP是爲了速度。必需要支持交互會話的應用程序,好比Talnet和FTP,就會使用TCP。而本身實現錯誤檢測或不須要過多錯誤控制的應用程序會傾向於使用UDP。網絡
軟件開發人員在設計網絡應用程序時能夠選擇使用TCP或UDP做爲傳輸協議。UDP的控制機制雖然比較簡單,但這並非它的缺點。首先,較簡單的質量控制並不必定意味着低質量。對於大多數應用程序來講,TCP提供的錯誤檢測與控制是徹底沒有必要的。在一些須要控制錯誤和流量控制的狀況下,有些開發人員更願意在應用程序自己內提供這些控制功能,從而能夠根據實際須要進行控制,並使用較簡單的UDP進行網絡訪問。例如,應用層的遠程過程調用RPC協議可以支持複雜的應用程序,但RPC開發人員有時傾向於在傳輸層使用UDP,而且利用應用程序提供錯誤控制和流量控制,而不是使用速度較慢的TCP鏈接
它包括如下重要特性:
TCP的功能之一是爲應用程序提供訪問網絡的接口。這個接口是經過TCP端口提供的,而爲了經過端口提供鏈接,必須打開TCP與應用程序的接口。TCP支持如下兩種打開狀態。
在一般狀況下,想接收鏈接的應用程序(好比FTP服務器)會把自身及其TCP端口置於被動打開狀態。在客戶端計算機上,FTP客戶端的TCP狀態通常是關閉的,直到用戶發起一個從FTP客戶端到FTP服務器的鏈接,這對於客戶端來講就是主動打開的。處於主動打開狀態的計算機上的TCP軟件會開始一些用於創建鏈接的信息交換,這種信息交換被稱爲「三次握手」,稍後詳細介紹
TCP發送的數據分段的長度是不定的。在一個數據分段內,每字節數據都被分配一個序列號。接收端計算機必須爲接收到的每一個字節數據都發送一確認信號。所以TCP通訊是一種傳輸與確認的系統。TCP報頭中的「序列號」和「確認號」字段讓通訊的TCP軟件可以按期更新傳輸的狀態。
實際上,數據分段中並非爲每一個字節都單獨編了一個序列號。而是在報頭的「序列號」字段指定了數據分段第一個字節的序列號。
若是數據分段被成功接收,接受端計算機會利用「確認號」字段告訴發送端計算機它接收到哪一個字節。在確認消息中,「確認號」字段的值是已接收的最後一個序列號加1.換句話說,「確認號」字段中的值是計算機準備接收的下一個序列號。
爲了讓序列/確認系統正常工做,計算機必須對序列號進行同步。換句話說,計算機B必須知道計算機A的初始化序列號(ISN)。計算機A也必須知道計算機B使用什麼ISN開始傳輸數據。
這個序列號的同步過程被稱爲三次握手。三次握手老是發生在TCP鏈接創建的初期,其步驟以下:
在這三次握手完成以後,鏈接就被打開了,TCP模塊就利用序列和確信機制發送和接收數據。
在謝希仁的《計算機網絡》中是這樣說的,爲了防止已失效的鏈接報文段又發送到了服務器端,從而產生錯誤
在書中同時舉了一個例子:「已失效的鏈接報文段」產生在這樣一種狀況下:client發出的第一個鏈接請求報文段並無消失,而是在某個網絡結點長時間的滯留了,以至於延誤到釋放之後的時間纔到達server。原本這是一個早已失效的報文段。但server收到此失效的鏈接請求報文段以後,就誤覺得是client再次發過來的一個新的鏈接請求。假設沒有「三次握手」,那麼只要server發出確認,新的鏈接就創建了。因爲如今client並無發出創建鏈接的請求,所以不會理睬server的確認,也不會向server發送數據。但server卻覺得新的運輸鏈接已經創建了,並一直等待client發來數據。這樣,server的資源就白白浪費了。
TCP報頭中的「窗口」字段爲鏈接提供了一種流量控制機制,其目的是防止發送端計算機不要發送得太快,以免接收端計算機來不及處理接收到的數據而致使數據丟失。TCP使用的流量控制方法被稱爲「滑動窗口」方法。接收端計算機利用「窗口」字段來定義一個超過最後一個已確認序列號的序列號「窗口」。在這個範圍內的序列號才容許發送端計算機進行發送。發送端計算機在沒有接收到下一個確認消息以前不能發送超過這個窗口的序列號。
當須要關閉鏈接時,計算機開始關閉過程,計算機A發送一個數據分段,其中的FIN標記設置爲1。以後應用程序進入「結束--等待」狀態。在這個狀態中,計算機A的TCP軟件繼續接收數據分段,並處理已經在序列中的數據分段,但再也不從應用程序接收數據了。當計算機B接收到FIN數據分段時,它返回對FIN的確認信息,而後發送剩餘的數據分段,通知本地應用程序接收到了FIN消息。計算機B向計算機A發送一個FIN數據分段,計算機A會返回確認消息,鏈接就被關閉了。
雖然UDP有時被認爲沒有錯誤檢驗功能,但實際上它可以執行基本的錯誤檢驗,所以,能夠說UDP具備有限的錯誤檢驗功能。UDP數據報中包含一個檢驗和,接收端計算機能夠利用它來檢驗數據的完整性(通常狀況下,這個校驗和檢查是可選的,並且可以被接收端計算機禁用以加快對接收數據的處理)。UDP數據報中有個一個僞報頭,包含了數據報的目的地址,從而提供了發現數據報錯誤傳輸的手段。另外,若是UDP接收模塊接收到一個發給未激活或未定義UDP端口的數據報,它會返回一個ICMP消息,通知源計算機這個端口是不可到達的。
其次,UDP沒有像TCP那樣提供數據的從新排序功能。在大型網絡上,數據分段可能會通過不一樣的路徑,因爲路由器緩存而產生明顯延時,這時從新排序功能是很是有意義的。而在局域網上,雖然UDP沒有從新排序功能,但通常不會致使不可靠的接收。
UDP協議的主要用途是把數據報傳遞給應用層。UDP協議的功能簡單,其報頭結構也很簡單。UDP不會從新傳輸丟失或損壞的數據報、從新排列混亂的接收數據、消除重複的數據報、確認數據報的接收、創建或是終止鏈接。它主要是在程序沒必要使用TCP鏈接開銷的狀況下發送和接收數據報的一種方式。若是上述功能對於應用程序來講是必需的,它能夠本身提供這些功能。
因爲實際的UDP報頭並不包含源IP地址或目標IP地址,數據報可能會被傳輸到錯誤的計算機或服務。校驗和使用部分數據來自於從IP報頭(被稱爲僞報頭)提取的值,這個僞報頭包含了目的IP地址信息,讓接收段計算機可以判斷UDP數據報是否被錯誤支付。
防火牆是一個系統,保護局域網不被來自Internet的未受權用戶攻擊。「防火牆」的基本特性就是阻斷對特定TCP和UDP端口的訪問。實際上,「防火牆」一詞有時具備動詞特性,表示關閉對端口的訪問。
例如,爲了發起與服務器的安全Shell(SSH)會話,客戶端計算機必須向SSH的熟知端(TCP22)發起一個請求。若是擔憂外部入侵者會經過SSH訪問咱們的服務器,一種方法是配置服務器來中止使用端口22。這樣一來,服務器就關閉了SSH的應用,但也禁止了局域網中的合法用戶使用SSH來完成正常操做。
另外一種方法是安裝防火牆,而且配置防火牆來阻斷對TCP端口22的訪問,這樣作的結果是,局域網中的用戶可以在防火牆以內自由地訪問服務器上的TCP端口22,而局域網以外的網絡用戶就不能訪問服務器的TCP端口22,也就不能經過SSH訪問服務器了。事實上,這時Internet上的用戶不能經過SSH訪問局域網中的任何計算機。
場景中使用SSH的TCP端口22做爲示例。防火牆一般會阻斷可能產生安全威脅的任何或所有端口。網絡管理員通常會阻斷對所有端口的訪問,除了必須的端口,好比處理E-mail的端口。在鏈接Internet的計算機上,好比Web服務器,一般會在外部放置一個防火牆,從而避免對這臺對這臺計算機的訪問致使對局域網的非法訪問
昨晚在騰訊筆試題中又遇到了幾道三次握手的題目,很遺憾沒有作對,現再繼續整理一下TCP通訊過程,如圖所示:
三次握手各個狀態的解釋以下:
四次揮手各類狀態的解釋以下:
爲何TIME_WAIT狀態還須要等2MSL後才能返回到CLOSED狀態?
答:這是由於:雖然對方贊成關閉鏈接了,並且握手的4個報文也都協調和發送完畢,按理說能夠直接回到CLOSED狀態;可是由於咱們必須假想網絡是不可靠的,你沒法保證最後發送的ACK報文會必定被對方收到,所以對方處於LAST_ACK狀態下的socket可能會由於超時未收到ACK報文,而重發FIN報文,這個TIME_WAIT的做用就是用來重發可能丟失的ACK報文
爲何要有TIME_WAIT狀態?
答:
參考連接:
TCP三次握手和Time-Wait狀態
什麼是2MSL
TCP的三次握手以及TCP狀態轉換圖詳解
TCP狀態轉換圖詳解