Author : Kevin Lynx
TCP是TCP/IP協議簇中傳輸層上的一種網絡協議,它是一種面向連接的、可靠的協議。為了提供這種可靠性,
TCP實現了各種有效的機制、算法。為了從一種宏觀的角度去了解這個協議,這里先大致地提一下與之相關
的概念。
1. 什么是‘面向連接的’?
引用<TCP/IP協議詳解>中的概念:
面向連接意味著兩個使用TCP的應用(通常是一個客戶和一個服務器)在彼此交換數據之前必須先建立
一個TCP連接。
2. 什么是‘三次握手’?
在建立TCP連接之前,兩個使用TCP的應用需要交換三次網絡數據。這三個數據包的來往也就是所謂的‘
三次握手’。
3. 報文段segment
我們說TCP是流式的網絡協議,那是因為,應用程序可以一直往TCP寫數據,無論你是逐byte,還是write
a chunk,TCP對應用傳給它的數據進行緩沖,直到緩沖數據達到一定尺寸才發送。可以看出,對于應用
而言,TCP就像是stream的。但事實上,在TCP層,數據還是以塊為單位的。這個塊也就是所謂的報文段
segment。
4. 什么是MTU?
MTU即最大傳輸單元(Maximum Transmission Unit,MTU)是指一種通信協議的某一層上面所能通過的
大數據報大小(以字節為單位)。我個人目前的理解認為,MTU是一個網絡在硬件層次上所允許的最大
數據包大小,例如以太網大概是1500字節。
5. 什么是MSS?
MSS即最大報文段大小(Maximum Segment Size),它是指TCP中一個報文段上附加的用戶數據的最大大小。
這里稍微說下應用層發送某個數據包時整個TCP/IP協議棧的操作過程:應用層將自己的用戶數據傳給TCP
層(傳輸層),TCP在這些數據前添加自己的協議頭(簡單地理解為附加一些數據),然后將數據交給
IP層(網絡層),IP層附加自己的協議頭,以此類推。
雖然MSS意思是最大報文段大小,但事實上它是排除了協議頭的用戶數據。
6. MTU and MSS ?
可以簡單地給你一個這樣的公示:mss = mtu - tcp_header_size - ip_header_size。
而通常,IP協議附加的協議頭大小和TCP的協議頭大小都是20字節,所以通常的MSS為1460字節。
注意,這里說的數字并不見得正確,因為MSS是可以被協商的。各種協議頭也可能被添加附加數據,但是
他們的關系是這樣的。
7. 什么是窗口大小?
找本TCP的書看下TCP數據包的包頭(本文多次使用數據包、報文的概念,我這里說的都是一樣的),你會
發現那個16位的窗口大小。
窗口這個域對于整個TCP協議都很重要。簡單地說,窗口大小是指接收端的接收緩存的大小。上面說了,應用
在發數據的時候,TCP會緩存這些數據,稍后發送。接收數據時也一樣,TCP接收數據并緩存起來,直到應用
調用recv之類的函數取數據時,TCP才將這些緩存數據清除。
TCP發送端會根據TCP接收端那個接收緩存大小決定發送多少數據(如何知道這個緩存大小?稍后給概念)。
這樣,TCP接收端的接收緩存才不至于緩沖溢出。
8. 提供可靠性的方法之一:ACK確認?
這里還不敢提序號、確認號、延時ACK等亂七八糟的東西。我只能告訴你,當TCP發送某些數據給TCP接收方
時,TCP接收方會發回一個確認報文。TCP發送方收到這個確認報文后,就可以確認剛才發送的數據包成功到達。
為什么這個確認報文叫ACK確認(貌似是我臨時給的概念:D)?再翻到TCP包頭結構那張圖,ACK是TCP包頭中
的1bit標志位,如同SYN、PSH、RST之類的標志一樣,這些標志都有一個專有的用途。當ACK標志位被設置為1
時,我就稱其為ACK確認標志,因為ACK就是用于確認報文段的。
在上面所說的窗口大小中,我提到,發送方如何知道接收方的接收緩存大小呢?這也是通過確認報文段實現:
當接收方接收到數據后,發送ACK確認數據包給發送方,就設置包頭中的窗口域。
9. 提供可靠性的方法之二:各種定時器
TCP中會設置很多計時器,這些定時器大多用于超時重傳(老半天得不到回應,所以重傳數據)。
10.什么是全雙工?
全雙工就是你可以同時在一個TCP連接上進行數據的發送和接收。這種雙工特性也促使了關閉TCP連接時的四次
握手。
11.TODO : more concepts...
這里我盡量簡單地介紹一些TCP中的概念,希望可以讓你有概括性的了解。預計下一節我會講講建立TCP連接的相關細節。
除了Stevens的<TCP/IP詳解>,我推薦<The TCP/IP Guide>,據說是另一部TCP的權威之作。