核心機制七----延時應答
默認情況下,接收方都是在收到數據報的第一時間,就返回ack,但是可以通過延時返回ack的方式來提高效率,理論上不是100%提高效率,但還是有一定幫助的。
因為如果接收數據的主機?刻返回ACK應答,這時候返回的窗?可能?較?.
- 假設接收端緩沖區為1M.?次收到了500K的數據;如果?刻應答,返回的窗?就是500K;?但實際上可能處理端處理的速度很快,10ms之內就把500K數據從緩沖區消費掉了?,在這種情況下,接收端處理還遠沒有達到??的極限,即使窗?再放??些,也能處理過來;
- 如果接收端稍微等?會再應答,?如等待200ms再應答,那么這個時候返回的窗???就是1M;??定要記得,窗?越?,?絡吞吐量就越?,傳輸效率就越?.我們的?標是在保證?絡不擁塞的情況下 盡量提?傳輸效率;
那么所有的包都可以延遲應答么?肯定也不是;
? 數量限制:每隔N個包就應答?次;?? 時間限制:超過最?延遲時間就應答?次;?具體的數量和超時時間,依操作系統不同也有差異;?般N取2,超時時間取200ms(這個數值不固定,根據實際情況而定);
核心機制八---捎帶應答
在延遲應答的基礎上,我們發現,很多情況下,客?端服務器在應?層也是"?發?收"的.意味著客?端 給服務器說了"How areyou",服務器也會給客?端回?個"Fine,thank you";?那么這個時候ACK就可以搭順??,和服務器回應的"Fine,thank you"?起回給客?端。
引入了延時應答,ack可以往后延時一段時間,恰好這個時候要返回響應數據,此時就可以把ack也代入到響應數據中,一起返回,ack設為1,窗口大小設為接收緩沖區剩余值,確認序號設為合適的值;把兩個包合成一個,就能起到提高效率的作用。
核心機制九---面向字節流
創建?個TCP的socket,同時在內核中創建?個發送緩沖區和?個接收緩沖區;
- 調?write時,數據會先寫?發送緩沖區中;?如果發送的字節數太?,會被拆分成多個TCP的數據包發出;?如果發送的字節數太短,就會先在緩沖區?等待,等到緩沖區?度差不多了,或者其他合適的時機發 送出去;
- ?接收數據的時候,數據也是從?卡驅動程序到達內核的接收緩沖區;然后應?程序可以調?read從接收緩沖區拿數據;
- 另???,TCP的?個連接,既有發送緩沖區,也有接收緩沖區,那么對于這?個連接,既可以讀數據,也可以寫數據.
- 這個概念叫做全雙?由于緩沖區的存在,TCP程序的讀和寫不需要??匹配,例如:寫100個字節數據時,可以調??次write寫100個字節,也可以調?100次write,每次寫?個字節;讀100個字節數據時,也完全不需要考慮寫的時候是怎么寫的,既可以?次read100個字節,也可以? 次read?個字節,重復100次;
在這個過程中會出現粘包問題
1.?先要明確,粘包問題中的"包",是指的應?層的數據包.?
- ?在TCP的協議頭中,沒有如同UDP?樣的"報??度"這樣的字段,但是有?個序號這樣的字段.
- ?站在傳輸層的?度,TCP是?個?個報?過來的.按照序號排好序放在緩沖區中.站在應?層的?度,看到的只是?串連續的字節數據.?那么應?程序看到了這么?連串的字節數據,就不知道從哪個部分開始到哪個部分,是?個完整的應 ?層數據包.
2. 那么如何避免粘包問題呢?歸根結底就是?句話,明確兩個包之間的邊界.?
- 對于定?的包,保證每次都按固定??讀取即可;例如上?的Request結構,是固定??的,那么就從 緩沖區從頭開始按sizeof(Request)依次讀取即可;
- 對于變?的包,可以在包頭的位置,約定?個包總?度的字段,從?就知道了包的結束位置;?對于變?的包,還可以在包和包之間使?明確的分隔符(應?層協議,是程序猿??來定的,只要保證 分隔符不和正?沖突即可);
?3.思考:對于UDP協議來說,是否也存在"粘包問題"呢?
- ?對于UDP,如果還沒有上層交付數據,UDP的報??度仍然在.同時,UDP是?個?個把數據交付給應 ?層.就有很明確的數據邊界.
- 站在應?層的站在應?層的?度,使?UDP的時候,要么收到完整的UDP報?,要么不收.不會出 現"半個"的情況.
核心機制十----異常情況的處理
TCP在通信過程中存在特殊情況
1.進程終止:進程終止和主動退出沒有本質區別,進程終止會釋放?件描述符,仍然可以發送FIN,進程雖然沒了,但是TCP的連接信息還存在,此時四次揮手還是可以正常進行的。。
2.主機關機:正常流程的關機,本質上還是會先殺死所有的用戶進程,與進程終止情況相同。
最終B任然可以把連接釋放掉?
3.主機掉電/網線斷開:接收端認為連接還在,?旦接收端有寫?操作,接收端發現連接已經不在了,就 會進?reset.即使沒有寫?操作,TCP??也內置了?個保活定時器,會定期詢問對?是否還在.如果 對?不在,也會把連接釋放。
主機掉電:
網線斷開就是上面兩種情況的結合
TCP小結
為什么TCP這么復雜?因為要保證可靠性,同時?盡可能的提?性能.
- 可靠性:?? 校驗和 ? 序列號(按序到達)? 確認應答 ? 超時重發 ? 連接管理 ? 流量控制 ? 擁塞控制
- 提?性能:? 滑動窗?? 快速重傳 ? 延遲應答 ? 捎帶應答
- 其他:?? 定時器(超時重傳定時器,保活定時器,TIME_WAIT定時器等)
TCP與UDP的對比
TCP用于可靠傳輸的情況,應用于文件傳輸,重要狀態更新等場景;UDP用于對?速傳輸和實時性要求較?的通信領域,例如,早期的QQ,視頻傳輸等.另外UDP可以? 于?播;
如何基于UDP實現可靠運輸?往TCP上套
3.網絡層
3.1IP協議
基本概念
? 主機:配有IP地址,但是不進?路由控制的設備;?? 路由器:即配有IP地址,?能進?路由控制;?? 節點:主機和路由器的統稱;
協議頭格式:
IP協議/網絡層做的工作,主要是兩個:
1.地址管理,使用IP地址這樣的概念,標識網絡上的某個設備的位置;
2.路由器選擇,在兩個通信的節點之間,規劃處一個合理的路徑。
各部分相關介紹:
- 4位版本號(version):指定IP協議的版本,對于IPv4來說,就是4.
- 4位首部長度:IP協議的報頭,也是變長的選項,IP頭部的?度是多少個32bit,也就是length*4的字節數.4bit表?最 ?的數字是15,因此IP頭部最??度是60字節.
- 8位服務類型:決定了IP協議的工作方式,3位優先權字段(已經棄?),4位TOS字段,和1位保留字段(必須置為 0).4位TOS分別表?:最?延時,最?吞吐量,最?可靠性,最?成本.這四者相互沖突,只能選擇?個.?對于ssh/telnet這樣的應?程序,最?延時?較重要;對于ftp這樣的程序,最?吞吐量?較重要.
- 16位總長度:IP數據報整體占多少個字節,就是一個IP數據報(報頭+載荷)的長度.
- 16位標識:拆包,把拆出來的多個包,設為相同的標識;組包,把相同標識的數據包組合到一起.
- 3位標志:其中一個標志位表示是否觸發了拆包操作,還有一個表示當前包是否是最后一個。
- 13位片偏移:描述了先后順序,偏移小的放前面,大的放后面.
- 8位生存時間:數據報到達?的地的最?報?跳數.?般是64.每次經過?個路 由,TTL-=1,?直減到0還沒到達,那么就丟棄了.這個字段主要是?來防?出現路由循環.
- 8位協議:標識傳輸層使用哪種協議,分用的時候,IP協議解析IP數據報的時候,拿到載荷,交給上層處理,此處8位協議號,就能起到區分效果.(傳輸層到應用層通過端口號區分,網絡層到傳輸層=>8位協議,數據鏈路層到網絡層=>也有一個類似的協議編號)
- 16位首部校驗和:使?CRC進?校驗,來鑒別頭部是否損壞.
- 32位源地址和32位?標地址:表?發送端和接收端,IP協議最關鍵的部分,IP地址本質上是通過32位的整數來表示的,由于32位 整數不方便閱讀,通常會把IP寫作點分十進制表示方式,用三個點分成四個部分。如圖:
.
3.2地址管理
IP不夠了該怎么辦?
1.動態分配IP:上網再分配,不上網就不分配,有所緩解,不能根本上解決問題.
2.NAT機制,網絡地址轉換(當前網絡世界最主要的方式),把所有的IP分成兩個大類
公網IP/外網IP:公網IP是唯一的
私網IP/內網IP:私網IP在不同的局域網中,可以重復。
- 10.*,前8位是?絡號,共16,777,216個地址?
- 172.16.到172.31.,前12位是?絡號,共1,048,576個地址
- 192.168.*,前16位是?絡號,共65,536個地址?包含在這個范圍中的,都成為私有IP,其余的則稱為全局IP(或公?IP);
NAT機制,就可以用一個外網IP對應到一系列的內網的設備,一個設備有一個獨立的局域網IP(允許重復),但是多個設備共用同一個外網IP(不允許重復).
NAT背景下網絡通信如何進行
1.同一個局域網下,設備A訪問設備B,由于IP本身不允許重復,自然不收任何影響,NAT不起到作用.
2.公網設備A訪問公網設備B,由于公網IP本身也不重復,也不受到影響,NAT不起作用.
3.不同局域網,設備A訪問設備B是不允許的,NAT機制禁止這樣的訪問方式.
4.局域網設備A訪問公網設備B.就是網絡地址映射。
相關流程圖:
5.公網設備A訪問局域網設備A,不允許.
3.IPv6:IPv6并不是IPv4的簡單升級版.這是互不相?的兩個協議,彼此并不兼容;IPv6?16字節128位 來表??個IP地址;但是?前IPv6還沒有普及.
IP地址的其他規則
?段劃分
IP地址分為兩個部分:?絡號和主機號
???絡號:保證相互連接的兩個?段具有不同的標識;主機號:同??段內,主機之間具有相同的?絡號,但是必須有不同的主機號;
在同一個局域網中,網絡號必須相同,主機號必須不同;兩個相鄰的局域網中,網絡號必須不同,主機號無限制。
- ?不同的??其實就是把?絡號相同的主機放到?起.
- 如果在??中新增?臺主機,則這臺主機的?絡號和這個??的?絡號?致,但是主機號必須不能和 ??中的其他主機重復.?通過合理設置主機號和?絡號,就可以保證在相互連接的?絡中,每臺主機的IP地址都不相同.
那么問題來了,?動管理??內的IP,是?個相當?煩的事情.
?? 有?種技術叫做DHCP,能夠?動的給??內新增主機節點分配IP地址,避免了?動管理IP的不便.??般的路由器都帶有DHCP功能.因此路由器也可以看做?個DHCP服務器。
過去曾經提出?種劃分?絡號和主機號的?案,把所有IP地址分為五類,如下圖所?:
這個方案,固定分為五類,使用前綴來區分是哪一類,每一個類,網絡主機號都是固定的,但隨著Internet的?速發展,這種劃分?案的局限性很快顯現出來,?多數組織都申請B類?絡地址,導致B 類地址很快就分配完了,?A類卻浪費了?量地址;
針對這種情況提出了新的劃分?案,稱為CIDR(Classless Interdomain Routing):
引??個額外的??掩碼(subnet mask)來區分?絡號和主機號;??掩碼也是?個32位的正整數.通常??串"0"來結尾;?將IP地址和??掩碼進?"按位與"操作,得到的結果就是?絡號;??絡號和主機號的劃分與這個IP地址是A類、B類還是C類?關;
可?,IP地址與??掩碼做與運算可以得到?絡號,主機號從全0到全1就是??的地址范圍;
特殊的IP地址
- ?將IP地址中的主機地址全部設為0,就成為了?絡號,代表這個局域?;
- ?將IP地址中的主機地址全部設為1,就成為了?播地址,?于給同?個鏈路中相互連接的所有主機發 送數據包;
- ?127.*的IP地址?于本機環回(loop back)測試,通常是127.0.0.1。
小結:
1.IPv4地址,占幾個字節,不夠用了(動態分配,NAT,IPv6);
2.IP地址構成:網絡號+主機號? 子網掩碼;
3.特殊的IP:主機號為0,主機號全為1,127開頭。
3.3路由選擇
通過IP協議進行數據轉發的過程,在復雜的?絡結構中,找出?條通往終點的路線;路由的過程,是?跳?跳"問路"的過程.?所謂"?跳"就是數據鏈路層中的?個區間.具體在以太?中指從源MAC地址到?的MAC地址之間的幀 傳輸區間.
主要步驟:
IP數據包的傳輸過程也和問路一樣,當數據包到達某個路由器的時候,就會匹配這個這個路由器的“路由表”(路由表記錄了這個路由器周圍的設備的IP,以及每個設備要通過那個路口轉發過去);如果目的IP剛好匹配到了路由表中的記錄,直接按照當前的對應的口轉發過去就行了;如果沒有匹配到,路由表就會有下一個特殊的表項,“下一跳”指向的設備,即上一級路由器所在的位置(這些路由器越往上,涵蓋的范圍也越大)。