OSI 7層模型
不同主機之間要進行通信串述,需要遵循共同的協(xié)議画畅。這些協(xié)議非常復雜谬盐,一般我們把它抽象成7層炕置,叫做OSI(open system interconnection) 7層模型兆沙。
從底向上依次是:
- 物理層
- 數(shù)據(jù)鏈路層 交換機
- 網(wǎng)絡層 路由器
- 傳輸層
- 會話層
- 表示層
- 應用層
數(shù)據(jù)在數(shù)據(jù)鏈路層叫幀(frame)欧芽,網(wǎng)絡層叫包(package),傳輸層叫段(segment)
對于這7層葛圃,每一層都有其相關的協(xié)議千扔,對于一個軟件開發(fā)工作人員,我們需要熟知的是:
- 網(wǎng)絡層: IP協(xié)議库正,ARP曲楚, RARP協(xié)議,ICMP協(xié)議褥符,IGMP協(xié)議
- 傳輸層: TCP協(xié)議龙誊, UDP協(xié)議
- 應用層: http協(xié)議,https協(xié)議喷楣,ftp趟大,tftp,smtp铣焊, snmp逊朽,dns
當數(shù)據(jù)經(jīng)過每一層時,都會對其封裝或解封裝
發(fā)送方是從高層到低層封裝數(shù)據(jù)
接收方是從底層往高層解封裝分析數(shù)據(jù)曲伊。
TCP協(xié)議
TCP協(xié)議工作在OSI七層中的傳輸層叽讳。說明這是一種傳輸控制協(xié)議,而且是可靠的,面向鏈接的協(xié)議岛蚤。它能:
- 將數(shù)據(jù)分段打包傳輸邑狸;
- 對每個數(shù)據(jù)包編號,控制順序
- 傳輸中丟失灭美,重發(fā)推溃,錯誤處理
- 流量控制避免擁堵
問題一:既然是面向連接,如何保證雙方都能有通信能力呢届腐?
主機A發(fā)送數(shù)據(jù)給主機B,如何知道主機A铁坎,主機B都有發(fā)送和接收的能力呢?最少要經(jīng)過這么三部犁苏。
1硬萍,主機A發(fā)送數(shù)據(jù)給主機B B知道A有發(fā)送能力
2,主機B回復主機A A知道B有發(fā)送能力围详,自己有接收能力
3朴乖,主機A回復主機B 主機B知道自己有發(fā)送能力
看到?jīng)],要確保主機A助赞,主機B都有發(fā)送买羞,接收數(shù)據(jù)的能力,至少要經(jīng)過這么三步雹食。這就是著名的三次握手畜普。是不是很簡單....
問題1.1: 如何設計三次握手更合理
主機A請求跟主機B通信
- 第一步主機A發(fā)送給主機B的數(shù)據(jù)其實是任何數(shù)據(jù)都行,看心情群叶,設計TCP協(xié)議的‘猿’設計了一個SYN(synchronize)標志,中文名同步的意思吃挑,數(shù)據(jù)是一個隨機數(shù),取名為sequence num街立,簡稱seq舶衬。seq是一個隨機數(shù)。
- 第二部主機B收到主機A的數(shù)據(jù)赎离,它需要告訴B逛犹,我收到你的數(shù)據(jù)了,主機B知道主機A很忙梁剔,可能會收到很多數(shù)據(jù)圾浅,如何讓主機A輕松知道這是我的回復數(shù)據(jù)呢?額外添加了一個確認的字段:acknowledgment num憾朴,簡稱ack狸捕。ack的值肯定和seq值有關系,很簡單众雷,加1就好了灸拍。因為A知道還有第三次連接做祝,我也發(fā)一個seq隨機數(shù)給你。為了讓你輕松知道鸡岗,我的是回復數(shù)據(jù)混槐,我給你個ACK(acknowledgment)標志,設置為1轩性。當然声登,SYN同樣為1(傳送了隨機的deq參數(shù))。
- 第三部主機A收到主機B回復揣苏,看到SYN=1悯嗓,SEQ=1,再看看acknowledgment正確卸察,通知主機B脯厨,沒問題,你可以和我通信了坑质。設置SYN=1合武,SEQ=1,ack的值為收到的seq+1涡扼,seq的值其實沒啥用了稼跳,隨便好了,把上個請求的seq+1傳了過去吃沪。
經(jīng)過這么三部汤善,主機A主機B就都知道自己和對方有發(fā)送接收數(shù)據(jù)能力了,接下來肯定要傳送數(shù)據(jù)了巷波,不然三次握手就白握了萎津。
問題二:如何傳送數(shù)據(jù)
主機A發(fā)送數(shù)據(jù)給主機B
假如此時seq為4000卸伞, ack為7000抹镊, 計算好此次傳送的數(shù)據(jù)是1514,則:
方向 | seq | ack | size |
---|---|---|---|
A->B | 4000 | 7000 | 1514 |
B->A | 7000 | 4000+1514-54=4146 | 54 |
A->B | 4146 | 7000+54-54=7000 | 1514 |
B->A | 7000 | 4146+1514-54=4292 | 54 |
問題三:如何知道數(shù)據(jù)傳送完了荤傲,需要斷開連接嗎垮耳?
主機A發(fā)送數(shù)據(jù)給主機B
第一步:主機A傳送的數(shù)據(jù)傳送完后,為了讓B知曉遂黍,將標志位FIN(finish)設置為1终佛,ACK設置為1,seq是上一次傳過來的雾家,ack為為上次傳過來的seq+1铃彰。
第二步:主機B收到A的數(shù)據(jù),發(fā)現(xiàn)FIN為1芯咧,將ACK置為1牙捉,ack為傳過來的seq+1竹揍,seq為傳過來的ack
第三步:主機B再次發(fā)送報文給A,將FIN設置為1邪铲,ACK為1芬位,ack為上一次的ack+1,seq為上一次的seq
第四步:A收到B的FIN回復带到,ACK=1昧碉,ack為上一次seq+1,seq為上一次ack+1揽惹。B收到后關閉連接被饿,A發(fā)送報文等待2ms關閉連接。
這就是所謂的四次揮手永丝。
網(wǎng)絡的只是這里只是自己的見解锹漱,幫助大家理解。后面還有更多心得一起奉上慕嚷。
參考: