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