如果我們想了解TCP/IP的參考模型椒舵,首先我們要對(duì)開放系統(tǒng)互連參考模型(Open System Interconnect 簡稱OSI)有一定的了解,這樣有助于加深對(duì)TCP/IP的理解股耽。
一亿絮、開放系統(tǒng)互連參考模型(Open System Interconnect 簡稱OSI)
開放系統(tǒng)互連參考模型 (Open System Interconnect 簡稱OSI)是國際標(biāo)準(zhǔn)化組織(ISO)和國際電報(bào)電話咨詢委員會(huì)(CCITT)聯(lián)合制定的開放系統(tǒng)互連參考模型勉盅,為開放式互連信息系統(tǒng)提供了一種功能結(jié)構(gòu)的框架洛二。它從低到高分別是:物理層蜀踏、數(shù)據(jù)鏈路層摩渺、網(wǎng)絡(luò)層、傳輸層、會(huì)話層洲愤、表示層和應(yīng)用層颓芭。
概述
開放系統(tǒng)互連參考模型為實(shí)現(xiàn)開放系統(tǒng)互連所建立的通信功能分層模型,簡稱OSI參考模型柬赐。其目的是為異種計(jì)算機(jī)互連提供一個(gè)共同的基礎(chǔ)和標(biāo)準(zhǔn)框架亡问,并為保持相關(guān)標(biāo)準(zhǔn)的一致性和兼容性提供共同的參考。這里所說的開放系統(tǒng)肛宋,實(shí)質(zhì)上指的是遵循OSI參考模型和相關(guān)協(xié)議能夠?qū)崿F(xiàn)互連的具有各種應(yīng)用目的的計(jì)算機(jī)系統(tǒng)州藕。
OSI參考模型是計(jì)算機(jī)網(wǎng)路體系結(jié)構(gòu)發(fā)展的產(chǎn)物。它的基本內(nèi)容是開放系統(tǒng)通信功能的分層結(jié)構(gòu)酝陈。這個(gè)模型把開放系統(tǒng)的通信功能劃分為七個(gè)層次床玻,從鄰接物理媒體的層次開始,分別賦于1沉帮,2锈死,……7層的順序編號(hào),相應(yīng)地稱之為物理層穆壕、數(shù)據(jù)鏈路層待牵、網(wǎng)絡(luò)層、運(yùn)輸層喇勋、會(huì)話層缨该、表示層和應(yīng)用層。每一層的功能是獨(dú)立的川背。它利用其下一層提供的服務(wù)并為其上一層提供服務(wù)压彭,而與其他層的具體實(shí)現(xiàn)無關(guān)。這里所謂的“服務(wù)”就是下一層向上一層提供的通信功能和層之間的會(huì)話規(guī)定渗常,一般用通信原語實(shí)現(xiàn)。兩個(gè)開放系統(tǒng)中的同等層之間的通信規(guī)則和約定稱之為協(xié)議汗盘。通常把1~4層協(xié)議稱為下層協(xié)議皱碘,5~7層協(xié)議稱為上層協(xié)議。
OSI七層模型每層的功能簡介
- 應(yīng)用層(Application) 提供網(wǎng)絡(luò)與用戶應(yīng)用軟件之間的接口服務(wù)
- 表示層(Presentation) 提供格式化的表示和轉(zhuǎn)換數(shù)據(jù)服務(wù)隐孽,如加密和壓縮
- 會(huì)話層(Session) 提供包括訪問驗(yàn)證和會(huì)話管理在內(nèi)的建立和維護(hù)應(yīng)用之間通信的機(jī)制
- 傳輸層(Transimission) 提供建立癌椿、維護(hù)和取消傳輸連接功能,負(fù)責(zé)可靠地傳輸數(shù)據(jù)(PC)
- 網(wǎng)絡(luò)層(Network) 處理網(wǎng)絡(luò)間路由菱阵,確保數(shù)據(jù)及時(shí)傳送(路由器)
- 數(shù)據(jù)鏈路層(DataLink) 負(fù)責(zé)無錯(cuò)傳輸數(shù)據(jù)踢俄,確認(rèn)幀、發(fā)錯(cuò)重傳等(交換機(jī))
- 物理層(Physics) 提供機(jī)械晴及、電氣都办、功能和過程特性(網(wǎng)卡、網(wǎng)線、雙絞線琳钉、同軸電纜势木、中繼器)
二、TCP/IP參考模型
TCP/IP是傳輸控制協(xié)議/網(wǎng)絡(luò)互聯(lián)協(xié)議的簡稱
早期的TCP/IP模型是一個(gè)四層結(jié)構(gòu)歌懒,從下往上依次是網(wǎng)絡(luò)接口層啦桌、互聯(lián)網(wǎng)層、傳輸層和應(yīng)用層
后來在使用過程中及皂,借鑒OSI七層參考模型甫男,將網(wǎng)絡(luò)接口層劃分為了物理層和數(shù)據(jù)鏈路層,形成五層結(jié)構(gòu)
常用協(xié)議
TCP/IP協(xié)議被稱為傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議验烧,又稱網(wǎng)絡(luò)通訊協(xié)議
是由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成板驳,是一個(gè)很大的協(xié)議集合
物理層和數(shù)據(jù)鏈路層沒有定義任何特定協(xié)議,支持所有的標(biāo)準(zhǔn)和專用的協(xié)議
網(wǎng)絡(luò)層定義了網(wǎng)絡(luò)互聯(lián)也就是IP協(xié)議
- 網(wǎng)際協(xié)議IP(Internet Protocal) 負(fù)責(zé)主機(jī)和網(wǎng)絡(luò)之間尋址和路由數(shù)據(jù)包
- 地址解析協(xié)議ARP(Address Resolution Protocol) 獲得同一物理網(wǎng)絡(luò)中的硬件主機(jī)MAC地址
- 反向地址轉(zhuǎn)換協(xié)議(Reverse Address Resolution Protocol) 允許局域網(wǎng)的物理機(jī)器從網(wǎng)關(guān)服務(wù)器的ARP表或者緩存上請(qǐng)求其IP地址
- 網(wǎng)際控制消息協(xié)議ICMP(Internet Control Message Protocol) 發(fā)送消息噪窘,并報(bào)告有關(guān)數(shù)據(jù)包的傳送錯(cuò)誤
- 互聯(lián)組管理協(xié)議IGMP(Internet Group Management Protocol) IP主機(jī)向本地多路廣播路由器報(bào)告主機(jī)組成員
傳輸層定義了TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報(bào))協(xié)議
應(yīng)用層定義了HTTP(超文本傳輸協(xié)議)笋庄、FTP(文件傳輸協(xié)議)、DNS(域名系統(tǒng))等協(xié)議
TCP/IP參考模型個(gè)別層上的協(xié)議名和數(shù)據(jù)名稱
X層 | 協(xié)議名稱 | 數(shù)據(jù)名稱 |
---|---|---|
傳輸層(Transport) | TCP | 塊(Segment) |
網(wǎng)絡(luò)層(Network) | IP | 包(Packet) |
數(shù)據(jù)鏈路層(Data Link) | ARP | 幀(Frame) |
數(shù)據(jù)從應(yīng)用層發(fā)下來倔监,會(huì)在每一層都會(huì)加上頭部信息直砂,進(jìn)行封裝冠跷,然后再發(fā)送到數(shù)據(jù)接收端亮航。這個(gè)基本的流程你需要知道,就是每個(gè)數(shù)據(jù)都會(huì)經(jīng)過數(shù)據(jù)的封裝和解封裝的過程晦毙。
TCP協(xié)議格式
如圖:
每個(gè)部分的功能
- Source Port和Destination Port:分別占用16位谱秽,表示源端口號(hào)和目的端口號(hào)洽蛀;用于區(qū)別主機(jī)中的不同進(jìn)程,而IP地址是用來區(qū)分不同的主機(jī)的疟赊,源端口號(hào)和目的端口號(hào)配合上IP首部中的源IP地址和目的IP地址就能唯一的確定一個(gè)TCP連接郊供;
- Sequence Number:用來標(biāo)識(shí)從TCP發(fā)端向TCP收端發(fā)送的數(shù)據(jù)字節(jié)流,它表示在這個(gè)報(bào)文段中的的第一個(gè)數(shù)據(jù)字節(jié)在數(shù)據(jù)流中的序號(hào)近哟;主要用來解決網(wǎng)絡(luò)報(bào)亂序的問題驮审;
- Acknowledgment Number:32位確認(rèn)序列號(hào)包含發(fā)送確認(rèn)的一端所期望收到的下一個(gè)序號(hào),因此吉执,確認(rèn)序號(hào)應(yīng)當(dāng)是上次已成功收到數(shù)據(jù)字節(jié)序號(hào)加1疯淫。不過,只有當(dāng)標(biāo)志位中的ACK標(biāo)志(下面介紹)為1時(shí)該確認(rèn)序列號(hào)的字段才有效戳玫。主要用來解決不丟包的問題熙掺;
- Offset:給出首部中32 bit字的數(shù)目,需要這個(gè)值是因?yàn)槿芜x字段的長度是可變的咕宿。這個(gè)字段占4bit(最多能表示15個(gè)32bit的的字币绩,即4*15=60個(gè)字節(jié)的首部長度)蜡秽,因此TCP最多有60字節(jié)的首部。然而类浪,沒有任選字段载城,正常的長度是20字節(jié);
- Window:窗口大小费就,也就是有名的滑動(dòng)窗口诉瓦,用來進(jìn)行流量控制;這是一個(gè)復(fù)雜的問題力细,這篇博文中并不會(huì)進(jìn)行總結(jié)的睬澡;
- TCP Flags:TCP首部中有6個(gè)標(biāo)志比特,它們中的多個(gè)可同時(shí)被設(shè)置為1眠蚂,主要是用于操控TCP的狀態(tài)機(jī)的煞聪,依次為URG,ACK逝慧,PSH昔脯,RST,SYN笛臣,F(xiàn)IN云稚。每個(gè)標(biāo)志位的意思如下:
URG:此標(biāo)志表示TCP包的緊急指針域(后面馬上就要說到)有效,用來保證TCP連接不被中斷沈堡,并且督促中間層設(shè)備要盡快處理這些數(shù)據(jù)静陈;
ACK:此標(biāo)志表示應(yīng)答域有效,就是說前面所說的TCP應(yīng)答號(hào)將會(huì)包含在TCP數(shù)據(jù)包中诞丽;有兩個(gè)取值:0和1鲸拥,為1的時(shí)候表示應(yīng)答域有效,反之為0僧免;
PSH:這個(gè)標(biāo)志位表示Push操作刑赶。所謂Push操作就是指在數(shù)據(jù)包到達(dá)接收端以后,立即傳送給應(yīng)用程序懂衩,而不是在緩沖區(qū)中排隊(duì)角撞;
RST:這個(gè)標(biāo)志表示連接復(fù)位請(qǐng)求。用來復(fù)位那些產(chǎn)生錯(cuò)誤的連接勃痴,也被用來拒絕錯(cuò)誤和非法的數(shù)據(jù)包;
SYN:表示同步序號(hào)热康,用來建立連接沛申。SYN標(biāo)志位和ACK標(biāo)志位搭配使用,當(dāng)連接請(qǐng)求的時(shí)候姐军,SYN=1铁材,ACK=0尖淘;連接被響應(yīng)的時(shí)候,SYN=1著觉,ACK=1村生;這個(gè)標(biāo)志的數(shù)據(jù)包經(jīng)常被用來進(jìn)行端口掃描。掃描者發(fā)送一個(gè)只有SYN的數(shù)據(jù)包饼丘,如果對(duì)方主機(jī)響應(yīng)了一個(gè)數(shù)據(jù)包回來 趁桃,就表明這臺(tái)主機(jī)存在這個(gè)端口;但是由于這種掃描方式只是進(jìn)行TCP三次握手的第一次握手肄鸽,因此這種掃描的成功表示被掃描的機(jī)器不很安全卫病,一臺(tái)安全的主機(jī)將會(huì)強(qiáng)制要求一個(gè)連接嚴(yán)格的進(jìn)行TCP的三次握手;
FIN: 表示發(fā)送端已經(jīng)達(dá)到數(shù)據(jù)末尾典徘,也就是說雙方的數(shù)據(jù)傳送完成蟀苛,沒有數(shù)據(jù)可以傳送了,發(fā)送FIN標(biāo)志位的TCP數(shù)據(jù)包后逮诲,連接將被斷開帜平。這個(gè)標(biāo)志的數(shù)據(jù)包也經(jīng)常被用于進(jìn)行端口掃描。
三次握手和四次揮手
三次握手
- 第一次握手:建立連接梅鹦●伤Γ客戶端發(fā)送連接請(qǐng)求報(bào)文段,將SYN位置為1帘瞭,Sequence Number為x淑掌;然后,客戶端進(jìn)入SYN_SEND狀態(tài)蝶念,等待服務(wù)器的確認(rèn)抛腕;
- 第二次握手:服務(wù)器收到SYN報(bào)文段。服務(wù)器收到客戶端的SYN報(bào)文段媒殉,需要對(duì)這個(gè)SYN報(bào)文段進(jìn)行確認(rèn)担敌,設(shè)置Acknowledgment Number為x+1(Sequence Number+1);同時(shí)廷蓉,自己自己還要發(fā)送SYN請(qǐng)求信息全封,將SYN位置為1,Sequence Number為y桃犬;服務(wù)器端將上述所有信息放到一個(gè)報(bào)文段(即SYN+ACK報(bào)文段)中刹悴,一并發(fā)送給客戶端,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)攒暇;
- 第三次握手:客戶端收到服務(wù)器的SYN+ACK報(bào)文段土匀。然后將Acknowledgment Number設(shè)置為y+1,向服務(wù)器發(fā)送ACK報(bào)文段形用,這個(gè)報(bào)文段發(fā)送完畢以后就轧,客戶端和服務(wù)器端都進(jìn)入ESTABLISHED狀態(tài)证杭,完成TCP三次握手。
完成了三次握手妒御,客戶端和服務(wù)器端就可以開始傳送數(shù)據(jù)解愤。以上就是TCP三次握手的總體介紹。
四次分手
當(dāng)客戶端和服務(wù)器通過三次握手建立了TCP連接以后乎莉,當(dāng)數(shù)據(jù)傳送完畢送讲,肯定是要斷開TCP連接的啊。那對(duì)于TCP的斷開連接梦鉴,這里就有了神秘的“四次分手”李茫。
- 第一次分手:主機(jī)1(可以使客戶端,也可以是服務(wù)器端)肥橙,設(shè)置Sequence Number和Acknowledgment Number魄宏,向主機(jī)2發(fā)送一個(gè)FIN報(bào)文段;此時(shí)存筏,主機(jī)1進(jìn)入FIN_WAIT_1狀態(tài)宠互;這表示主機(jī)1沒有數(shù)據(jù)要發(fā)送給主機(jī)2了;
- 第二次分手:主機(jī)2收到了主機(jī)1發(fā)送的FIN報(bào)文段椭坚,向主機(jī)1回一個(gè)ACK報(bào)文段予跌,Acknowledgment Number為Sequence Number加1;主機(jī)1進(jìn)入FIN_WAIT_2狀態(tài)善茎;主機(jī)2告訴主機(jī)1券册,我“同意”你的關(guān)閉請(qǐng)求;
- 第三次分手:主機(jī)2向主機(jī)1發(fā)送FIN報(bào)文段垂涯,請(qǐng)求關(guān)閉連接烁焙,同時(shí)主機(jī)2進(jìn)入LAST_ACK狀態(tài);
- 第四次分手:主機(jī)1收到主機(jī)2發(fā)送的FIN報(bào)文段耕赘,向主機(jī)2發(fā)送ACK報(bào)文段骄蝇,然后主機(jī)1進(jìn)入TIME_WAIT狀態(tài);主機(jī)2收到主機(jī)1的ACK報(bào)文段以后操骡,就關(guān)閉連接九火;此時(shí),主機(jī)1等待2MSL后依然沒有收到回復(fù)册招,則證明Server端已正常關(guān)閉岔激,那好,主機(jī)1也可以關(guān)閉連接了是掰。
到這里我們是不是非常疑惑鹦倚,為什么要三次握手、四次分手呢冀惭?
先來回答為什么要三次握手震叙?
在謝希仁著《計(jì)算機(jī)網(wǎng)絡(luò)》第四版中講“三次握手”的目的是“為了防止已失效的連接請(qǐng)求報(bào)文段突然又傳送到了服務(wù)端,因而產(chǎn)生錯(cuò)誤”散休。在另一部經(jīng)典的《計(jì)算機(jī)網(wǎng)絡(luò)》一書中講“三次握手”的目的是為了解決“網(wǎng)絡(luò)中存在延遲的重復(fù)分組”的問題媒楼。
在謝希仁著《計(jì)算機(jī)網(wǎng)絡(luò)》書中同時(shí)舉了一個(gè)例子,如下:
“已失效的連接請(qǐng)求報(bào)文段”的產(chǎn)生在這樣一種情況下:client發(fā)出的第一個(gè)連接請(qǐng)求報(bào)文段并沒有丟失戚丸,而是在某個(gè)網(wǎng)絡(luò)結(jié)點(diǎn)長時(shí)間的滯留了划址,以致延誤到連接釋放以后的某個(gè)時(shí)間才到達(dá)server。本來這是一個(gè)早已失效的報(bào)文段限府。但server收到此失效的連接請(qǐng)求報(bào)文段后夺颤,就誤認(rèn)為是client再次發(fā)出的一個(gè)新的連接請(qǐng)求。于是就向client發(fā)出確認(rèn)報(bào)文段胁勺,同意建立連接世澜。假設(shè)不采用“三次握手”,那么只要server發(fā)出確認(rèn)署穗,新的連接就建立了寥裂。由于現(xiàn)在client并沒有發(fā)出建立連接的請(qǐng)求,因此不會(huì)理睬server的確認(rèn)案疲,也不會(huì)向server發(fā)送數(shù)據(jù)封恰。但server卻以為新的運(yùn)輸連接已經(jīng)建立,并一直等待client發(fā)來數(shù)據(jù)褐啡。這樣诺舔,server的很多資源就白白浪費(fèi)掉了。采用“三次握手”的辦法可以防止上述現(xiàn)象發(fā)生备畦。例如剛才那種情況低飒,client不會(huì)向server的確認(rèn)發(fā)出確認(rèn)。server由于收不到確認(rèn)萍恕,就知道client并沒有要求建立連接逸嘀。”
總結(jié):三次握手是為了防止了服務(wù)器端的一直等待而浪費(fèi)資源允粤。
為什么要四次分手崭倘?
那四次分手又是為何呢?TCP協(xié)議是一種面向連接的类垫、可靠的司光、基于字節(jié)流的運(yùn)輸層通信協(xié)議。TCP是全雙工模式悉患,這就意味著残家,當(dāng)主機(jī)1發(fā)出FIN報(bào)文段時(shí),只是表示主機(jī)1已經(jīng)沒有數(shù)據(jù)要發(fā)送了售躁,主機(jī)1告訴主機(jī)2坞淮,它的數(shù)據(jù)已經(jīng)全部發(fā)送完畢了茴晋;但是,這個(gè)時(shí)候主機(jī)1還是可以接受來自主機(jī)2的數(shù)據(jù)回窘;當(dāng)主機(jī)2返回ACK報(bào)文段時(shí)诺擅,表示它已經(jīng)知道主機(jī)1沒有數(shù)據(jù)發(fā)送了,但是主機(jī)2還是可以發(fā)送數(shù)據(jù)到主機(jī)1的啡直;當(dāng)主機(jī)2也發(fā)送了FIN報(bào)文段時(shí)烁涌,這個(gè)時(shí)候就表示主機(jī)2也沒有數(shù)據(jù)要發(fā)送了,就會(huì)告訴主機(jī)1酒觅,我也沒有數(shù)據(jù)要發(fā)送了撮执,之后彼此就會(huì)愉快的中斷這次TCP連接。
TCP功能
- 將數(shù)據(jù)進(jìn)行分段打包傳輸
- 對(duì)每個(gè)數(shù)據(jù)包編號(hào)控制順序
- 運(yùn)輸中丟失舷丹、重發(fā)和丟棄處理
- 流量控制避免擁塞