Tcp傳輸之前建立連接要進(jìn)行“三次握手”冠息,斷開連接要進(jìn)行“四次揮手”觉痛。
seq是數(shù)據(jù)包本身的序列號(hào),這是為了連接以后傳送數(shù)據(jù)用的段化,ack是對收到的數(shù)據(jù)包的確認(rèn)嘁捷,值是期待接收的數(shù)據(jù)包的序列號(hào)。
在第一次消息發(fā)送中显熏,A隨機(jī)選取一個(gè)序列號(hào)作為自己的初始序號(hào)發(fā)送給B雄嚣;第二次消息B使用ack對A的數(shù)據(jù)包進(jìn)行確認(rèn),因?yàn)橐呀?jīng)收到了序列號(hào)為x的數(shù)據(jù)包喘蟆,準(zhǔn)備接收序列號(hào)為x+1的包缓升,所以ack=x+1,同時(shí)B告訴A自己的初始序列號(hào)履肃,就是seq=y仔沿;第三條消息A告訴B收到了B的確認(rèn)消息并準(zhǔn)備建立連接,A自己此條消息的序列號(hào)是x+1尺棋,所以seq=x+1封锉,而ack=y+1是表示A正準(zhǔn)備接收B序列號(hào)為y+1的數(shù)據(jù)包。
為什么建立連接是三次握手膘螟,而關(guān)閉連接卻是四次揮手呢成福?
這是因?yàn)榉?wù)端在LISTEN狀態(tài)下,收到建立連接請求的SYN報(bào)文后荆残,把ACK和SYN放在一個(gè)報(bào)文里發(fā)送給客戶端奴艾。而關(guān)閉連接時(shí),收到對方的FIN報(bào)文時(shí)内斯,僅僅表示對方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù)蕴潦,己方也未必全部數(shù)據(jù)都發(fā)送給對方了,所以己方可以立即close俘闯,也可以發(fā)送一些數(shù)據(jù)給對方后潭苞,再發(fā)送FIN報(bào)文給對方來表示同意現(xiàn)在關(guān)閉連接,因此真朗,己方ACK和FIN一般都會(huì)分開發(fā)送此疹。
(因?yàn)槭盏絊YN報(bào)文后,己方可能還有東西需要發(fā)送遮婶,所以先發(fā)送ACK蝗碎,再發(fā)送SYN)
網(wǎng)絡(luò)中的七層協(xié)議
?表示層, 幫我們解決不同系統(tǒng)之間的通信語法問題(例如Linux傳向Windows)
會(huì)話層旗扑, 建立和管理應(yīng)用程序之間的通信蹦骑。?
傳輸層, 可以傳輸大量文件肩豁,對數(shù)據(jù)進(jìn)行封裝脊串。
網(wǎng)絡(luò)層辫呻,即路由器,交換價(jià)那些具有尋址功能的設(shè)備所實(shí)現(xiàn)的功能琼锋。這一層定義的是IP地址放闺,通過IP地址尋址。所以產(chǎn)生了IP協(xié)議缕坎。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
鏈路層怖侦, 通過無線電波等其它介質(zhì)傳輸,具有糾錯(cuò)功能谜叹。
?物理層匾寝,?主要定義物理設(shè)備標(biāo)準(zhǔn),如網(wǎng)線的接口類型荷腊、光纖的接口類型艳悔、各種傳輸介質(zhì)的傳輸速率等。這一層傳輸?shù)臄?shù)據(jù)叫做比特女仰。
TCP猜年,是用于發(fā)大量數(shù)據(jù)的,我發(fā)了1萬個(gè)包出去疾忍,另一臺(tái)電腦就要告訴我是否接受到了1萬個(gè)包乔外,如果 缺了3個(gè)包,就告訴我是第1001一罩,234杨幼,8888個(gè)包丟了,那我再發(fā)一次聂渊。這樣差购,就能保證對方把這個(gè)視頻完整接收了。
UDP汉嗽,是用于發(fā)送少量數(shù)據(jù)的歹撒。我發(fā)20個(gè)包出去,一般不會(huì)丟包诊胞,所以,我不管你收到多少個(gè)锹杈。在多人互動(dòng)游戲撵孤,也經(jīng)常用UDP協(xié)議,因?yàn)橐话愣际呛唵蔚男畔⒔咄矣袕V播的需求邪码。如果用TCP,效率就很低咬清,因?yàn)樗鼤?huì)不停地告訴主機(jī)我收到了20個(gè)包闭专,或者我收到了18個(gè)包奴潘,再發(fā)我兩個(gè)!如果同時(shí)有1萬臺(tái)計(jì)算機(jī)都這樣做影钉,那么用TCP反而會(huì)降低效率画髓,還不如用UDP,主機(jī)發(fā)出去就算了平委,丟幾個(gè)包你就卡一下奈虾,算了,下次再發(fā)包你再更新廉赔。
TCP協(xié)議是會(huì)綁定IP和端口的協(xié)議肉微。