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è)客戶(hù)和一個(gè)服務(wù)器)在彼此交換數(shù)據(jù)之前必須先建立
一個(gè)TCP連接。
2. 什么是‘三次握手’?
在建立TCP連接之前,兩個(gè)使用TCP的應(yīng)用需要交換三次網(wǎng)絡(luò)數(shù)據(jù)。這三個(gè)數(shù)據(jù)包的來(lái)往也就是所謂的‘
三次握手’。
3. 報(bào)文段segment
我們說(shuō)TCP是流式的網(wǎng)絡(luò)協(xié)議,那是因?yàn)椋瑧?yīng)用程序可以一直往TCP寫(xiě)數(shù)據(jù),無(wú)論你是逐byte,還是write
a chunk,TCP對(duì)應(yīng)用傳給它的數(shù)據(jù)進(jìn)行緩沖,直到緩沖數(shù)據(jù)達(dá)到一定尺寸才發(fā)送??梢钥闯?,對(duì)于應(yīng)用
而言,TCP就像是stream的。但事實(shí)上,在TCP層,數(shù)據(jù)還是以塊為單位的。這個(gè)塊也就是所謂的報(bào)文段
segment。
4. 什么是MTU?
MTU即最大傳輸單元(Maximum Transmission Unit,MTU)是指一種通信協(xié)議的某一層上面所能通過(guò)的
大數(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)文段上附加的用戶(hù)數(shù)據(jù)的最大大小。
這里稍微說(shuō)下應(yīng)用層發(fā)送某個(gè)數(shù)據(jù)包時(shí)整個(gè)TCP/IP協(xié)議棧的操作過(guò)程:應(yīng)用層將自己的用戶(hù)數(shù)據(jù)傳給TCP
層(傳輸層),TCP在這些數(shù)據(jù)前添加自己的協(xié)議頭(簡(jiǎn)單地理解為附加一些數(shù)據(jù)),然后將數(shù)據(jù)交給
IP層(網(wǎng)絡(luò)層),IP層附加自己的協(xié)議頭,以此類(lèi)推。
雖然MSS意思是最大報(bào)文段大小,但事實(shí)上它是排除了協(xié)議頭的用戶(hù)數(shù)據(jù)。
6. MTU and MSS ?
可以簡(jiǎn)單地給你一個(gè)這樣的公示:mss = mtu - tcp_header_size - ip_header_size。
而通常,IP協(xié)議附加的協(xié)議頭大小和TCP的協(xié)議頭大小都是20字節(jié),所以通常的MSS為1460字節(jié)。
注意,這里說(shuō)的數(shù)字并不見(jiàn)得正確,因?yàn)镸SS是可以被協(xié)商的。各種協(xié)議頭也可能被添加附加數(shù)據(jù),但是
他們的關(guān)系是這樣的。
7. 什么是窗口大?。?/strong>
找本TCP的書(shū)看下TCP數(shù)據(jù)包的包頭(本文多次使用數(shù)據(jù)包、報(bào)文的概念,我這里說(shuō)的都是一樣的),你會(huì)
發(fā)現(xiàn)那個(gè)16位的窗口大小。
窗口這個(gè)域?qū)τ谡麄€(gè)TCP協(xié)議都很重要。簡(jiǎn)單地說(shuō),窗口大小是指接收端的接收緩存的大小。上面說(shuō)了,應(yīng)用
在發(fā)數(shù)據(jù)的時(shí)候,TCP會(huì)緩存這些數(shù)據(jù),稍后發(fā)送。接收數(shù)據(jù)時(shí)也一樣,TCP接收數(shù)據(jù)并緩存起來(lái),直到應(yīng)用
調(diào)用recv之類(lèi)的函數(shù)取數(shù)據(jù)時(shí),TCP才將這些緩存數(shù)據(jù)清除。 TCP發(fā)送端會(huì)根據(jù)TCP接收端那個(gè)接收緩存大小決定發(fā)送多少數(shù)據(jù)(如何知道這個(gè)緩存大???稍后給概念)。
這樣,TCP接收端的接收緩存才不至于緩沖溢出。
8. 提供可靠性的方法之一:ACK確認(rèn)?
這里還不敢提序號(hào)、確認(rèn)號(hào)、延時(shí)ACK等亂七八糟的東西。我只能告訴你,當(dāng)TCP發(fā)送某些數(shù)據(jù)給TCP接收方
時(shí),TCP接收方會(huì)發(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之類(lèi)的標(biāo)志一樣,這些標(biāo)志都有一個(gè)專(zhuān)有的用途。當(dāng)ACK標(biāo)志位被設(shè)置為1
時(shí),我就稱(chēng)其為ACK確認(rèn)標(biāo)志,因?yàn)锳CK就是用于確認(rèn)報(bào)文段的。
在上面所說(shuō)的窗口大小中,我提到,發(fā)送方如何知道接收方的接收緩存大小呢?這也是通過(guò)確認(rèn)報(bào)文段實(shí)現(xiàn):
當(dāng)接收方接收到數(shù)據(jù)后,發(fā)送ACK確認(rèn)數(shù)據(jù)包給發(fā)送方,就設(shè)置包頭中的窗口域。
9. 提供可靠性的方法之二:各種定時(shí)器
TCP中會(huì)設(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...
這里我盡量簡(jiǎn)單地介紹一些TCP中的概念,希望可以讓你有概括性的了解。預(yù)計(jì)下一節(jié)我會(huì)講講建立TCP連接的相關(guān)細(xì)節(jié)。
除了Stevens的<TCP/IP詳解>,我推薦<The TCP/IP Guide>,據(jù)說(shuō)是另一部TCP的權(quán)威之作。