在Android網(wǎng)絡(luò)編程-計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)一文中得知,IP協(xié)議屬于網(wǎng)絡(luò)層,TCP、UDP協(xié)議屬于傳輸層。
IP協(xié)議是TCP/IP協(xié)議族的動(dòng)力,它為上層協(xié)議提供無(wú)狀態(tài)、無(wú)連接、不可靠的服務(wù)。
TCP協(xié)議是面向連接的傳輸層協(xié)議,提供一種面向連接的、可靠的字節(jié)流服務(wù)。
UDP協(xié)議是面向無(wú)連接的傳輸層協(xié)議,提供面向事務(wù)的簡(jiǎn)單不可靠信息傳輸服務(wù)。
數(shù)據(jù)報(bào)文
在不同層傳輸?shù)臄?shù)據(jù)單位名稱(chēng)不同,在網(wǎng)絡(luò)層傳輸?shù)慕袛?shù)據(jù)報(bào),在傳輸層傳輸?shù)慕袌?bào)文段。
IP數(shù)據(jù)報(bào)
IP數(shù)據(jù)報(bào)格式如下圖:
各個(gè)字段的詳細(xì)說(shuō)明:名稱(chēng)長(zhǎng)度說(shuō)明版本4bitIP協(xié)議的版本,目前的IP協(xié)議版本號(hào)為4,下一代IP協(xié)議版本號(hào)為6首部長(zhǎng)度4bitIP報(bào)頭的長(zhǎng)度,最大長(zhǎng)度60字節(jié)(15*4),
分為固定部分的長(zhǎng)度(20字節(jié))和可變部分的長(zhǎng)度服務(wù)類(lèi)型8bitType Of Service總長(zhǎng)度16bitIP報(bào)文的總長(zhǎng)度。數(shù)據(jù)報(bào)的最大長(zhǎng)度為 65535 字節(jié)標(biāo)識(shí)16bit它是一個(gè)計(jì)數(shù)器,用來(lái)產(chǎn)生數(shù)據(jù)報(bào)的標(biāo)識(shí)。
當(dāng)IP報(bào)文長(zhǎng)度超過(guò)傳輸網(wǎng)絡(luò)的MTU(最大傳輸單元)時(shí)必須分片,此標(biāo)識(shí)表示同一個(gè)數(shù)據(jù)報(bào)的分片。標(biāo)志3bitR、DF、MF三位,目前只有后兩位有效。
- DF位:為1表示不分片,為0表示分片。
- MF:為1表示“更多的片”,為0表示這是最后一片。片偏移13bit本分片在原先數(shù)據(jù)報(bào)文中相對(duì)首位的偏移位。
片偏移以8個(gè)字節(jié)為偏移單位。生存時(shí)間8bitTTL (Time To Live)表示數(shù)據(jù)報(bào)在網(wǎng)絡(luò)中的壽命,其單位為秒。
在目前的實(shí)際應(yīng)用中,常以“跳”為單位。協(xié)議8bit指出IP報(bào)文攜帶的數(shù)據(jù)使用的哪種協(xié)議,以便目的主機(jī)的IP層能知道要將數(shù)據(jù)報(bào)上交到哪個(gè)進(jìn)程。
TCP的協(xié)議號(hào)為6,UDP的協(xié)議號(hào)為17。
ICMP的協(xié)議號(hào)為1,IGMP的協(xié)議號(hào)為2.首部校驗(yàn)和16bit計(jì)算IP頭部的校驗(yàn)和,檢查IP報(bào)頭的完整性。源地址32bit標(biāo)識(shí)IP數(shù)據(jù)報(bào)的源端設(shè)備。目的地址32bit標(biāo)識(shí)IP數(shù)據(jù)報(bào)的目的地址??蛇x字段長(zhǎng)度可變1~40 字節(jié),用于增加IP數(shù)據(jù)報(bào)的控制功能。填充保證IP首部長(zhǎng)度是4字節(jié)的整倍數(shù)
TCP報(bào)文
名稱(chēng)長(zhǎng)度說(shuō)明源端口16bit數(shù)據(jù)發(fā)送方的端口號(hào)目的端口16bit數(shù)據(jù)接受方的端口號(hào)序號(hào)32bit本數(shù)據(jù)報(bào)文中的的第一個(gè)字節(jié)的序號(hào)
(在數(shù)據(jù)流中每個(gè)字節(jié)都對(duì)應(yīng)一個(gè)序號(hào))確認(rèn)號(hào)32bit希望收到的下一個(gè)數(shù)據(jù)報(bào)文中的第一個(gè)字節(jié)的序號(hào)數(shù)據(jù)偏移4bit表示本報(bào)文數(shù)據(jù)段距離報(bào)文段有多遠(yuǎn)保留字段6bit保留為今后使用,但目前應(yīng)置為0緊急比特URG當(dāng)值為1時(shí)表示次報(bào)文段中有需要緊急處理確認(rèn)比特ACK值為1時(shí)確認(rèn)號(hào)有效,值為0時(shí)確認(rèn)號(hào)無(wú)效復(fù)位比特RST值為1時(shí)表示TCP連接存在嚴(yán)重的錯(cuò)誤,需要重新進(jìn)行連接同步比特SYN值為1表示這是一個(gè)連接請(qǐng)求或連接接受報(bào)文終止比特FIN值為1表示要發(fā)送的數(shù)據(jù)報(bào)已經(jīng)發(fā)送完畢,需要釋放傳送連接窗口16bitTCP連接的一端根據(jù)緩存空間的大小來(lái)確定自己接受窗口的大小
限制發(fā)送放的窗口上限檢驗(yàn)和16bit用來(lái)檢驗(yàn)首部和數(shù)據(jù)兩部分的正確性緊急指針字段16bit緊急指針指出在本報(bào)文段中的緊急數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)選項(xiàng)字段長(zhǎng)度可變TCP 首部可以有多達(dá)40字節(jié)的可選信息,
用于把附加信息傳遞給終點(diǎn),或用來(lái)對(duì)齊其它選項(xiàng)
UDP報(bào)文
相對(duì)于TCP報(bào)文,UDP報(bào)文簡(jiǎn)單了很多。
名稱(chēng)長(zhǎng)度說(shuō)明源端口16bit數(shù)據(jù)發(fā)送方的端口號(hào)目的端口16bit數(shù)據(jù)接受方的端口號(hào)包長(zhǎng)度16bitUDP首部的長(zhǎng)度和數(shù)據(jù)的長(zhǎng)度之和。單位為字節(jié)校驗(yàn)和16bit用來(lái)檢驗(yàn)首部和數(shù)據(jù)兩部分的正確性
TCP三次握手和四次揮手
TCP用三次握手來(lái)創(chuàng)建連接,使用四次分手來(lái)釋放連接。
三次握手
三次握手的目的是同步連接雙方的序列號(hào)和確認(rèn)號(hào)并交換TCP窗口大小的信息。
握手過(guò)程:
- 第一次握手:建立連接,客戶端先發(fā)送連接請(qǐng)求報(bào)文,將SYN設(shè)置為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+1);同時(shí),自己還要送法SYN消息,將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)文段。然后將Acknowlegment Number設(shè)為y+1,向服務(wù)器發(fā)送ACK報(bào)文段,這個(gè)報(bào)文段發(fā)送完畢后,客戶端端服務(wù)器都進(jìn)入ESTABLISHED狀態(tài),完成TCP三次握手。
完成了三次握手,客戶端和服務(wù)器就可以開(kāi)始傳送數(shù)據(jù)了。
四次揮手
當(dāng)客戶端和服務(wù)端傳輸數(shù)據(jù)完畢后,需要斷開(kāi)TCP連接。TCP斷開(kāi)的過(guò)程,就是四次揮手。
- 第一次揮手:客戶端(也可以是服務(wù)器),設(shè)置Sequence Number和Acknowledgment Number,向服務(wù)器發(fā)送一個(gè)FIN報(bào)文段。此時(shí)客戶端進(jìn)入FIN_WAIT_1狀態(tài);這表示客戶端沒(méi)有數(shù)據(jù)發(fā)送給主機(jī)了。
- 第二次揮手:服務(wù)器收到客戶端發(fā)來(lái)的FIN報(bào)文段,向客戶端回一個(gè)ACK報(bào)文段,Acknowledgement Number為Sequence Number加1;客戶端進(jìn)入FIN_WAIT_2狀態(tài),服務(wù)器進(jìn)入CLOSE_WAIT狀態(tài);服務(wù)器告訴客戶端,我同意你的”關(guān)閉”請(qǐng)求。
- 第三次揮手:服務(wù)器向客戶端發(fā)送FIN報(bào)文段,請(qǐng)求關(guān)閉連接,同時(shí)服務(wù)器進(jìn)入LAST_ACK狀態(tài)。
- 第四次揮手:客戶端收到服務(wù)器發(fā)送的FIN報(bào)文段,向主機(jī)發(fā)送ACK報(bào)文段,然后客戶端進(jìn)入TIME_WAIT狀態(tài),服務(wù)器收到客戶端的ACK報(bào)文段以后,就關(guān)閉連接,此時(shí),客戶端等待2MSL后一次沒(méi)有到收到回復(fù),則證明服務(wù)端已正常關(guān)閉,那好,客戶端也可以關(guān)閉連接了。
TCP三次握手的必要性
防止服務(wù)器端因接收了早已失效的連接請(qǐng)求報(bào)文,從而一直等待客戶端請(qǐng)求,最終導(dǎo)致形成死鎖、浪費(fèi)資源。
TCP四次揮手的必要性
為了保證通信雙方都能通知對(duì)方,需釋放、斷開(kāi)連接。
為什么客戶端關(guān)閉連接前要等待2MSL時(shí)間
- MSL: 最大報(bào)文段生存時(shí)間
四個(gè)報(bào)文發(fā)送完畢后,就可以直接進(jìn)入CLOSE狀態(tài)了,但是有可能網(wǎng)絡(luò)是不可靠的,一切都可能發(fā)生,比如有可能最后一個(gè)ACK丟失。所以TIME_WAIT狀態(tài)是用來(lái)重發(fā)可能丟失的ACK報(bào)文。展開(kāi)具體來(lái)講:
- 為了保證客戶端發(fā)送的最后1個(gè)連接釋放確認(rèn)報(bào)文 能到達(dá)服務(wù)器,從而使得服務(wù)器能正常釋放連接。
- 防止早已失效的連接請(qǐng)求報(bào)文,出現(xiàn)在本連接中。客戶端發(fā)送了最后1個(gè)連接釋放請(qǐng)求確認(rèn)報(bào)文后,再經(jīng)過(guò)2MSL時(shí)間,則可使本連接持續(xù)時(shí)間內(nèi)所產(chǎn)生的所有報(bào)文段都從網(wǎng)絡(luò)中消失。
TCP、UDP比較
- TCPUDP可靠性可靠不可靠連接性面向連接無(wú)連接報(bào)文面向字節(jié)流面向報(bào)文效率低效高效雙工性全雙工一對(duì)一,一對(duì)多,多對(duì)一,多對(duì)多
- 支持多播和廣播流量控制滑動(dòng)窗口機(jī)制擁塞控制慢開(kāi)始/擁塞避免
- 快重傳/快恢復(fù)傳輸速度慢快應(yīng)用場(chǎng)景效率要求相對(duì)低,準(zhǔn)確要求相對(duì)高。
- 要求有連接的場(chǎng)景效率要求相對(duì)高,準(zhǔn)確要求相對(duì)低應(yīng)用SMTP,TELNET,HTTP,F(xiàn)TPDNS,RIP,NFS,SNMP,
- IP電話,流媒體