再談Http和Https及TCP/UDP/IP協(xié)議分析,面試官都驚訝的網(wǎng)絡見解
時間:2023-02-19 20:58:01 | 來源:建站知識
時間:2023-02-19 20:58:01 來源:建站知識
再談Http和Https及TCP/UDP/IP協(xié)議分析,面試官都驚訝的網(wǎng)絡見解:
一. 再談HTTP再理解
- 協(xié)議的本質(zhì): 雙方的一種約定,規(guī)則,雙方需要按照相同的一套處理機制(協(xié)議)進行處理
- 應用層協(xié)議對應的是一個服務, FTP文件傳輸協(xié)議, NDS域名解析協(xié)議, HTTP超文本傳輸協(xié)議, 這些是協(xié)議同時也對應著一個服務.
- http協(xié)議的本質(zhì) : http協(xié)議的本質(zhì)是要獲得某種資源 (視頻,音頻, 網(wǎng)頁,圖片等)
實際上,上網(wǎng)的大部分行為都是在進行進程間通信.. 也就是不斷地獲取信息和發(fā)送信息比如:1. 把服務器上面地資源數(shù)據(jù)拿到本地 (短視頻, 網(wǎng)頁)2. 把本地地數(shù)據(jù)推送到服務器 (搜索, 注冊,登錄,下單)http的底層一般是基于傳輸層協(xié)議tcp實現(xiàn)的
- 瀏覽器和web服務器三次握手建立TCP連接
- 瀏覽器進行 req (request請求)
- 服務器進行 rep (reply響應)
- 瀏覽器和web服務器四次揮手斷開TCP連接
http是超文本傳輸協(xié)議, 在底層實現(xiàn)中涉及了很多地文本解析
再談http地無狀態(tài): 指協(xié)議不具備記憶地能力, 不需要對于進程間通信地歷史狀態(tài)進行保存, 服務器是無法判斷用戶是否歷史上曾經(jīng)打開過這個網(wǎng)頁了的. 也就是上一次打開網(wǎng)頁和這一次打開相同的網(wǎng)頁互相不關聯(lián), 也不知道你上次打開過. (不會記憶)這個就叫做無狀態(tài)
request 報文
response 報文
- 在寫HTTP服務器的時候我們必須按照上述的報文格式進行書寫
- 在整個收發(fā)請求數(shù)據(jù)和應答數(shù)據(jù)報文的時候會進行報文的解析, 之所以每一個結束位置都是一個CRLF,就是回車換行的意思, 所有的信息以一行一行的形式進行呈現(xiàn)出來
- 空行出現(xiàn)的原因: 作為報頭和有效載荷的分割符號. 循環(huán)著一行一行的讀取, 直到讀取到空行代表報頭讀取完畢
主要請求方法解釋:
- GET : 直接獲取對應的資源信息(eg: 網(wǎng)頁) 資源從哪來 URL定位
- POST : 將數(shù)據(jù)交給服務器, 通過正文提交, 不需要URL定位
上述便是需要Content-Length的原因, 獲知正文是否存在以及正文長度再次手寫一個便理解的簡單的http://httpserver.cc 的服務器, 使用C++完成#include <iostream>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <strings.h>#include <signal.h>#include <string>#include <fstream> #define ERR_EXIT(m) / do { std::cerr << m << std::endl; close(EXIT_FAILURE); } while(0)typedef struct sockaddr SA; int main() { signal(SIGCHLD, SIG_IGN);//信號處理, 避免子進程僵尸 int listenfd, connfd, pid; socklen_t addLen; struct sockaddr_in clientAdd, serveAdd; if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ) { ERR_EXIT("socket"); } int flag = 1; setsockopt(listenfd,SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); //SO_REUSEADDR BOOL 允許套接口和一個已在使用中的地址捆綁(參見bind()) //SOL_SOCKET固定level設置 bzero(&serveAdd, sizeof(serveAdd));//清空 serveAdd.sin_family = AF_INET;//協(xié)議家族 serveAdd.sin_port = htons(8080);//默認80端口 serveAdd.sin_addr.s_addr = htonl(INADDR_ANY); //INADDR_ANY == 0 作用適配地址 if (bind(listenfd, (SA*)&serveAdd, sizeof(serveAdd)) == -1) { ERR_EXIT("bind"); } //3: 等待隊列syn隊列的長度 if (listen(listenfd, 3) == -1) { ERR_EXIT("listen"); } while (1) { if ((connfd = accept(listenfd, (SA*)&clientAdd, &addLen)) == -1) { ERR_EXIT("accept"); } pid = fork();//fork出來子進程 if (pid) { close(connfd); //父進程關閉connfd然后僅僅進行l(wèi)isten. SIGCHLD會自動收尸 } else { close(listenfd);//子進程進行發(fā)送響應報文 char buffer[1024]; recv(connfd, buffer, sizeof(buffer), 0); std::cout << "#############################http request begin#############################################"<<std::endl; //打印recv的來自客戶端的請求并且輸出請求信息 std::cout << buffer << std::endl; std::cout << "#############################http request end#############################################"<<std::endl; std::ifstream ifs("./index.html"); if (ifs) { int len; ifs.seekg(0L, ifs.end);//定位到文件末尾 len = ifs.tellg();//獲取文件長度 ifs.seekg(0L, ifs.beg);//回到文件開頭 char *file = new char[len]; ifs.read(file, len);//讀取正文, 字符串形式讀取 ifs.close(); //開始處理響應: std::string status_line = "HTTP/1.1 200 OK/r/n";//狀態(tài)行 std::string reply_header;//響應頭部 reply_header +="Content-Length: " + std::to_string(len) + "/r/n"; std::string black = "/r/n"; send(connfd, status_line.c_str(), status_line.size(), 0); send(connfd, reply_header.c_str(), reply_header.size(), 0); send(connfd, black.c_str(), black.size(), 0); send(connfd, file, len, 0); delete [] file; } close(connfd); exit(EXIT_SUCCESS); } } close(listenfd); return 0;}
服務器IP : 端口號 可以訪問, 服務器可能沒有開放端口, 可以在購買的服務器安全組中設置- 再次圖解小結HTTP, 整個協(xié)議棧的角度去看
- 注意: 這個http應用層簡單的理解是直接和對端建立了連接好似是直接和對端進行請求響應的交互方式, 然后一次連接完成之后立馬斷開, 但是其實真正傳輸數(shù)據(jù)包的時候, 是需要貫穿整個協(xié)議棧的, 也就是http請求是將自己的數(shù)據(jù)傳給下層的, 是有封包和解包的過程的, 不理解可以看入門篇
- 再強調(diào)一下http叫啥: 超文本傳輸協(xié)議, 其實蠻簡單的, 就是傳輸?shù)奈谋? 文本內(nèi)容在數(shù)據(jù)報文的正文中,正文前面有報頭請求行(請求), 或者是報頭和狀態(tài)行(響應).... 報頭和有效載荷的分離依賴的是空行.
- 請求行: 請求方法(GET, POST) URL:資源定位 協(xié)議版本(HTTP/1.0 HTTP/1.1 ...)
- 響應狀態(tài)行: 協(xié)議版本, 狀態(tài)碼 狀態(tài)碼描述信息。。。
- 中間的各種 鍵: 值 對(首部字段名: 值) 都是各種細節(jié)信息 eg : Content-Length
- 空行: 分隔報頭和有效載荷(正文)
相關視頻推薦《tcpip詳解卷一》:150行代碼拉開協(xié)議棧實現(xiàn)的篇章
網(wǎng)絡原理tcp/udp,網(wǎng)絡編程epoll/reactor,面試中正經(jīng)“八股文”
學習地址:C/C++Linux服務器開發(fā)/后臺架構師
需要C/C++ Linux服務器架構師學習資料加qun
812855908獲?。ㄙY料包括
C/C++,Linux,golang技術,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協(xié)程,DPDK,ffmpeg等),免費分享
二. HTTP對比學習HTTPS
HTTPS : 是以安全為目標的HTTP通道, 通俗說就是安全版本的HTTP,
為啥需要HTTPS
- HTTP的請求信息是明文傳輸, 容易被竊取
- HTTP不會驗證對方的信息, 存在被冒充的風險
- 數(shù)據(jù)的完整性沒有校驗, 容易被中間人篡改
為啥叫做HTTPS , S的含義,
SSL:加密,在HTTP下加入SSL層 (解決上述問題)SSL操作步驟:
- 驗證服務器端
- 允許客戶端和服務端選擇加密算法和密碼, 確保雙方都支持
- 驗證客戶端
- 使用公鑰加密技術來生成共享加密數(shù)據(jù)
- 創(chuàng)建一個加密的SSL連接
- 基于該SSL連接傳遞HTTP請求
HTTPS的主要作用:一個是建立一個信息安全通道,用來保證數(shù)據(jù)傳輸?shù)陌踩?,另外一個就是驗證網(wǎng)站的真實性了...HTTP和HTTPS的區(qū)別如下:
- https協(xié)議需要 ca申請證書,一般免費的證書較少,因而是需要一定費用的]
- http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的SSL加密傳輸協(xié)議
- http 和 https使用的是完全不同的連接方式,用的端口也是不一樣的。前者是80端口 后者是443端口
- http的連接很簡單,是無狀態(tài)的;https協(xié)議是由 SSL + HTTP協(xié)議構建的可進行加密傳輸,身份認證的網(wǎng)絡協(xié)議,比http協(xié)議安全.
- 在OSI模型中,HTTP工作在應用層,而HTTPS工作在傳輸層
寫傳輸層協(xié)議之前先介紹一個四元組的概念: 網(wǎng)絡通信的實現(xiàn)就是基于四元組的,不論是TCP還是UDP 要想將數(shù)據(jù)從一端傳入到另外一端,就必須明確對端的二元組, 雙方如果都要相互通信就要確定四元組首先我們確定要雙方不同主機上的不同進程間進行通信, 必須確定雙方的 ip + port why?上述圖主要是為了引出為啥要 ip
上述圖是為了引出為啥需要 port- 至此我想聰明的大家自然是明白了為啥一定要確定四元組雙發(fā)才能通信了
- 上述四元組可謂是特別重要的一個鋪墊了, 后序的TCP最大連接數(shù)目等等咱要分析清楚其實都還得必須從上述這個得限制入手了. (這個也是面試的??键c)
三.TCP協(xié)議 (三次握手四次揮手細節(jié)過程理解在之前的博文中有詳細圖解)
報文分析
源 / 目的端口,那就是老身常談了, 從哪個進程來,到哪個進程去
32位序號和確認序號 (原諒咱留個小疑惑,后面解釋,和重傳機制有關系)
4位TCP報頭長度: 表示該TCP頭部有多少個32位bit(有多少個4字節(jié)); 所以TCP頭部最大長度是15 * 4 = 60 (基本衡量單位都是4字節(jié)為最小單位) 因為首部長度是4位 最大就是15; 所以最大首部長度就是 15 * 4 (最小單位) = 60字節(jié)
6位標志位:
- URG: 緊急指針是否有效
- ACK: 確認號是否有效
- PSH: 提示接收端應用程序立刻從TCP緩沖區(qū)把數(shù)據(jù)讀走
- RST: 對方要求重新建立連接; 我們把攜帶RST標識的稱為復位報文段
- SYN: 請求建立連接; 我們把攜帶SYN標識的稱為同步報文段
- FIN: 通知對方, 本端要關閉了, 我們稱攜帶FIN標識的為結束報文段
16位窗口大?。ㄏ攘魝€疑,其實就是存儲接收緩沖區(qū)還剩下的大小, 和流量控制有關)16位校驗和: 發(fā)送端填充, CRC校驗. 接收端校驗不通過, 則認為數(shù)據(jù)有問題. 此處的檢驗和不光包含TCP首部, 也 包含TCP數(shù)據(jù)部分6位緊急指針: 標識哪部分數(shù)據(jù)是緊急數(shù)據(jù)tcp緩沖區(qū)概念的引入 (解釋流量控制):
tcp連接建立之后是存在接收和發(fā)送內(nèi)核緩沖區(qū)的....
send 還有 recv這些接口都不是直接將數(shù)據(jù)發(fā)送到網(wǎng)路中,也不是直接從網(wǎng)路中讀取數(shù)據(jù)的...
而是存在發(fā)送緩沖區(qū)和接收緩沖區(qū)的概念, 這些都是內(nèi)核緩沖區(qū)。。。同樣之前的窗口大小其實就是接收緩沖區(qū)還剩余的大小, 支持流量控制 (你發(fā)送的數(shù)據(jù)不能超過,不然就滿了)
接收緩沖區(qū)大寫也對應著流量控制:why? 如何理解接收端處理數(shù)據(jù)的速度是有限的. 如果發(fā)送端發(fā)的太快, 導致接收端的緩沖區(qū)被打滿, 這個時候如果發(fā)送端繼續(xù)發(fā)送, 就會造成丟包, 繼而引起丟包重傳等等一系列連鎖反應.
因此TCP支持根據(jù)接收端的處理能力, 來決定發(fā)送端的發(fā)送速度. 這個機制就叫做流量控制(Flow Control)
所以窗口大小就是接收端處理能力的代表 (發(fā)送端接收到窗口大小會根據(jù)窗口大小進行調(diào)節(jié)自己的發(fā)送速度,進行流量控制) 填充窗口字段就是填充的自身的接收緩沖區(qū)中剩余空間的大小 (此窗口也稱為接收窗口)
窗口大小字段越大, 說明網(wǎng)絡的吞吐量越高;
確認應答(ACK)機制的理解 (編序號)
ACK應答的含義就是: acknum 之前的序號的數(shù)據(jù)包我都已經(jīng)收到了,下一次你從acknum開始發(fā)送吧超時重傳機制
超時重發(fā)指的是因為網(wǎng)絡環(huán)境的擁堵阻塞導致了在很長一段時間發(fā)送方都沒有等到自己之前發(fā)送包的回音 (于是TCP默認是丟包)然后會采取重傳措施
由于重傳機制,會存在一些情況是 之前因為網(wǎng)絡擁堵的數(shù)據(jù)包 在網(wǎng)絡環(huán)境恢復之后正常傳入到對端, 導致對端可能會收到多份重復的數(shù)據(jù)報文,不過嘞因為序號的存在可以通過需要進行簡單的去重即可
但是這個超時時間如何確認??? 多少算合適,這個也是個置得討論的問題
- 最理想的情況下, 找到一個最小的時間, 保證 "確認應答一定能在這個時間內(nèi)返回".
- 但是這個時間的長短, 隨著網(wǎng)絡環(huán)境的不同, 是有差異的.
- 如果超時時間設的太長, 會影響整體的重傳效率;
- 如果超時時間設的太短, 有可能會頻繁發(fā)送重復的包;
TCP為了保證無論在任何環(huán)境下都能比較高性能的通信, 因此會動態(tài)計算這個最大超時時間.(抓核心主題,據(jù)網(wǎng)絡環(huán)境而生 超時時間)- Linux中(BSD Unix和Windows也是如此), 超時以500ms為一個單位進行控制, 每次判定超時重發(fā)的超時 時間都是500ms的整數(shù)倍.
- 如果重發(fā)一次之后, 仍然得不到應答, 等待 2*500ms 后再進行重傳.
- 如果仍然得不到應答, 等待 4*500ms 進行重傳. 依次類推, 以指數(shù)形式遞增.
- 累計到一定的重傳次數(shù), TCP認為網(wǎng)絡或者對端主機出現(xiàn)異常, 強制關閉連接.
滑動窗口理解
- 首先滑動窗口的前提是基于緩沖區(qū)來實現(xiàn)的, 沒有緩沖區(qū)是做不到滑動窗口的,流量控制同樣也是做不到的
- 滑動窗口的出現(xiàn)是根據(jù)緩沖區(qū)大小來進行一次發(fā)送多條數(shù)據(jù)來提升性能...
- 可以思考一下反正我需要發(fā)很多數(shù)據(jù),1 - 1000 1001 - 2000 2001 - 3000 ... 我是可以采取一條一條的發(fā)送,等待一條有了回音,再繼續(xù)發(fā)送下一條,可是如果窗口是足夠的情況下我可以一次發(fā)送多條數(shù)據(jù),這樣可以將每條數(shù)據(jù)的等待應答時間重疊起來,實現(xiàn)效率性能的提升...
- 如同上圖這般,同時發(fā)送多條數(shù)據(jù) (將多條數(shù)據(jù)的等待應答時間壓縮成一條數(shù)據(jù)的等待應答時間)
- 窗口大小指的是無需等待確認應答而可以繼續(xù)發(fā)送數(shù)據(jù)的最大值. 上圖的窗口大小就是3000個字節(jié)(3個 段). 這個稱為發(fā)送窗口大小 (是根據(jù)所在端的發(fā)送緩沖區(qū)大小和對端的接收緩沖區(qū)的大小中取出最小值來確定的)
- 發(fā)送前四個段的時候, 不需要任何等待,直接可以發(fā)送
- 收到第一個ACK后, 滑動窗口向后移動, 繼續(xù)發(fā)送第五個段的數(shù)據(jù); 依次類推
- 操作系統(tǒng)內(nèi)核為了維護這個滑動窗口, 需要開辟 發(fā)送緩沖區(qū) 來記錄當前還有哪些數(shù)據(jù)沒有應答; 只有確 認應答過的數(shù)據(jù), 才能從緩沖區(qū)刪掉
- 窗口越大, 則網(wǎng)絡的吞吐率就越高
滑動窗口下的丟包問題分析
第一種是ACK丟失如上述情況下,滑動窗口的ACK部分丟失其實不是很緊要,因為可以通過后序的ACK確認;ACK一旦確認之后代表的含義是 默認之前的所有序列數(shù)據(jù)都已經(jīng)全部收到了情況2是數(shù)據(jù)包傳過去的時候就丟失了- 當某一段報文段丟失之后, 發(fā)送端會一直收到 1001 這樣的ACK, 就像是在提醒發(fā)送端 "我想要的是 1001" 一樣
- 然后; 如果發(fā)送端主機連續(xù)三次收到了同樣一個 "1001" 這樣的應答, 就會將對應的數(shù)據(jù) 1001 - 2000 重新發(fā)送;
- 這個時候接收端收到了 1001 之后, 再次返回的ACK就是7001了(因為2001 - 7000)接收端其實之前就已 經(jīng)收到了, 被放到了接收端操作系統(tǒng)內(nèi)核的接收緩沖區(qū)中 (提前收到的后序的報文也不會丟棄, 只是前面的沒有確認 后面的也就無法確認,因為一旦確認就默認前面的所有數(shù)據(jù)全部已經(jīng)收到了)
- 這種機制被稱為 "高速重發(fā)控制"(也叫 "快重傳").
單獨解釋一下 快重傳 : 就是說在接收方收到一個失序的報文段的時候就立即會發(fā)出重復確認。(目的在于使得發(fā)送方盡早地知道說自己有報文丟失了,沒有到達對面)接收方地意思就是 哥你確定你發(fā)的是對的,我前面的報文都還沒收到 (順序不對呀)三次之后發(fā)送方反應過來直接重傳,不再等待超時
擁塞控制
- (滑動窗口) 大小決定 min( 接收窗口決定的 , 擁塞窗口決定 (發(fā)送方發(fā)送緩沖區(qū)大小))
- why需要慢開始,最一開始發(fā)送方會將發(fā)送窗口(擁塞窗口的)設置的很小 ?
- 因為網(wǎng)絡環(huán)境錯綜復雜,剛開始不清楚網(wǎng)絡環(huán)境的好壞, 所以滿開始就有點像是派個偵察兵去看看,網(wǎng)絡環(huán)境咋樣,然后再進一步調(diào)整擁塞窗口的大小 確定滑動窗口大小..
- 先探測一下當前的網(wǎng)絡擁塞程度,然后由小到大的逐漸增大擁塞窗口的大小.
- 然后是指數(shù)級的擴張滑動窗口大小,但是也不能一直那樣擴大下去,于是有一個閾值的概念,超過這個閾值又轉變?yōu)榫€性增長了
- 當TCP開始啟動的時候, 慢啟動閾值等于窗口最大值
- 在每次超時重發(fā)的時候, 慢啟動閾值會變成原來的一半, 同時擁塞窗口置回
- 少量的丟包, 我們僅僅是觸發(fā)超時重傳; 大量的丟包, 我們就認為網(wǎng)絡擁塞;
- 當TCP通信開始后, 網(wǎng)絡吞吐量會逐漸上升; 隨著網(wǎng)絡發(fā)生擁堵, 吞吐量會立刻下降
- 其實就是為了保證在不造成網(wǎng)絡環(huán)境壓力太大的情況下盡快將數(shù)據(jù)傳輸過去
TCP小結
TCP是面向連接的,可靠的,基于字節(jié)流的傳輸層通信協(xié)議如何保證可靠性:性能提升上面:1. 采取了滑動窗口2. 快速重傳 (不需要等待超時,三次對端提醒之后自動重傳)基于TCP應用層協(xié)議 HTTP HTTPS SSH Telnet FTP SMTPTCP最大連接數(shù)的分析(面試???(從四元組的角度入手)
- 客戶端 和 服務器之間建立連接 : 只要確??蛻舳说?ip + 客戶端的 port 兩個中存在一個和服務端不同即可建立連接.....
- 理論最大 : 最大TCP連接數(shù)目 = 客戶端ip數(shù)目 * 客戶端端口數(shù)目
- ipv4而言理論ip 數(shù)目最多是 2 ^ 32 port 數(shù)目是 65535 = 2 ^ 16, 所以理論最大的TCP連接數(shù)目是 2 ^ 48
- 但是并發(fā)數(shù)目是萬萬不可能達到上述這么多的. (考慮并發(fā)) 首先第一個就是文件描述符的限制 sockfd數(shù)量限制,當然這個可以在服務器中修改配置... ulimit
- 還有就是內(nèi)存的限制了,TCP存在發(fā)送和接收內(nèi)核緩沖區(qū), 你用戶空間也還要開緩沖區(qū),所以肯定是無法達到上述哪個恐怖的數(shù)目的
四.UDP協(xié)議
先從報文分析入手- 源端口號: 客戶端端口號.
- 目的端口號:服務器端口號, 負責確定交付給哪個應用程序.
- 一個應用程序可以綁定多個端口號,但是一個端口號一定是對應一個應用程序.(端口號標識唯一應用程序)
- 16位UDP長度, 表示整個數(shù)據(jù)報(UDP首部+UDP數(shù)據(jù))的最大長度
- 如果校驗和出錯, 就會直接丟棄
- 報頭理解, 報頭實現(xiàn)地方式, 使用C語言中地位段進行理解: 多少位分為一段
UDP的特征: 什么是無連接,不可靠,關鍵為什么它如此的不穩(wěn)定但是在現(xiàn)在的短視頻 音視頻通話 DNS ARP這些全部都還使用的是UDP作為傳輸層協(xié)議
首先是無連接, 連接是什么: 連接算是一端到另外一端的不存在的一根線 (抽象的來說,這個是我的個人理解, 連接的過程也就是三次握手的過程)對于三次握手不理解的可以看我前文鏈接存在詳解
首先不論是有連接還是無連接, 我們核心應該確定的是什么? 確定四元組,對了四元組,無連接也可以進程間通信,只不過每一次必須傳入四元組, 但是口說無憑, 咱看看接口唄。對比一下:
為什么UDP是不可靠連接?因為UDP沒有TCP的哪些為了保證可靠性的機制: 比如超時重傳機制,擁塞控制,流量控制機制,為數(shù)據(jù)包編號排序等...
思考為啥UDP如此不可靠我們還必須要使用它, 而且還會盡量的使其變得可靠, 還要專門做UDP可靠性設計,這個不是多次一舉嗎. 不如直接使用TCP?
首先解釋UDP相比TCP為什么相對實時性好, 在時間上更短, 更加快速。。。
以上是從不必要的三次握手建立連接上解釋這個速度問題, 為啥UDP更快
而且在進行數(shù)據(jù)傳輸?shù)臅r候TCP還會存在一定的時間限制,時間閾值,超過這個時間就需要進行重傳, 重傳也會導致延遲性,向我們的qq聊天呀就經(jīng)常出現(xiàn)這樣的延遲現(xiàn)象,很明顯底層應當是采取的TCP作為傳輸層協(xié)議.
根據(jù)上述的延遲解釋一下音視頻通話為例解釋下為啥使用UDP而不是TCP?一句話解釋:就是通話延遲的問題,我們qq上發(fā)個消息是無所謂,延遲下我們可以等會看嘛,但是你在跟別人搞音視頻,像抖音這些,或者各種視頻,這個要是通話延遲,幾秒前說的話幾秒后出來了你這個還搞個屁呀, 還說得清嘛,這個很明顯需要實時通話,正是這樣的場景存在所以UDP必然是需要的。。。而且現(xiàn)在音視頻(短視頻)如此火爆更是少不了UDP了
我們再從另外一個角度來分析一下這個問題, 服務端壓力上面來考慮。。。
再談UDP可靠傳輸?shù)脑O計。。。
現(xiàn)有的udp可靠傳輸協(xié)議就是KCP了,感興趣的還真有必要得去深入研究一下,我個人是研究深度還不夠,先暫且淺顯的聊一聊這個UDP可靠傳輸設計的一些基本的東西,KCP要是將來我的理解深入足夠會盡力刨析一下...首先既然提到了MTU 先解釋一下 MTU是個啥玩也.總結UDP可靠傳輸?shù)膶W習:- 多研究TCP協(xié)議的實現(xiàn)
- 設計 udp可靠傳輸,和TCP不一樣,重傳策略受到我們的控制可控 (也不一定所有都需要重傳) 像音視頻,游戲走位 超時太久丟包就丟了,不需要重傳... 但是有些其他應用場景下又必須進行重傳
- 重傳時機的確定 (根據(jù)具體的業(yè)務需求去設計,不要一味追求設計一個通用性的UDP可靠傳輸協(xié)議)
五. 對比TCP和UDP的細節(jié)
- 連接
- TCP是面向連接的傳輸層協(xié)議,傳輸數(shù)據(jù)前需要先建立連接
- UDP 是不需要建立連接的。 即可馬上立即傳輸數(shù)據(jù) (接口傳入二元組)
- 服務對象
- TCP是一對一的兩點服務,即一條連接只有兩個斷點
- UDP支持一對一 ,一對多, 多對多的交互通信
- 可靠性
- TCP是可靠交付數(shù)據(jù)的,數(shù)據(jù)無差錯,不重復,按順序到達
- UDP則是盡力交付,不保證可靠 (因為沒有各種傳輸策略)
總結本文
- 本文從再看HTTP 和 對比學習 HTTPS入手
- HTTP協(xié)議的學習核心在于搞清楚他是一次性的無狀態(tài)連接方式,連接建立之后服務結束立馬斷開連接。。。
- 還有就是搞清楚HTTP的報文格式
- 上述的核心在于最開始的一行請求行 (請求方法 URL 協(xié)議版本) + 狀態(tài)行(協(xié)議版本 狀態(tài)碼 狀態(tài)碼描述字段) 搞清楚空行的作用:分割報頭和正文
- HTTPS對比 HTTP學習 : 一個是明文傳輸?shù)慕嵌葋砜?另外一個是從網(wǎng)站真實性,身份驗證,中間數(shù)據(jù)修改 的角度來看去分析,HTTPS相對 HTTP多了SSL加密層
- 然后是UDP和TCP的學習:
- UDP無連接的 基于一個一個數(shù)據(jù)包的傳輸?shù)囊环N 不可靠傳輸協(xié)議 (但是因為其相對TCP的快速 (實時性更好) + 可制定各種傳輸策略實現(xiàn)可靠傳輸 )在音視頻通話等領域有著不可替代的作用
- TCP有連接的 基于數(shù)據(jù)流的可靠傳輸協(xié)議 (可靠的核心在于各種策略機制)
關鍵詞:驚訝,網(wǎng)絡,分析,協(xié)議