TCP和UDP的區(qū)別
TCP是一個面向連接的、可靠的、基于字節(jié)流的傳輸層協(xié)議。
而UDP是一個面向無連接的傳輸層協(xié)議。
具體來分析,和 UDP 相比,TCP 有三大核心特性:
面向連接:所謂的連接,指的是客戶端和服務(wù)器的連接,在雙方互相通信之前,TCP 需要三次握手建立連接,而 UDP 沒有相應(yīng)建立連接的過程。
可靠性:TCP 花了很多的功夫來保證連接的可靠,這個可靠性體現(xiàn)在哪些方面呢?一個是有狀態(tài),另一個是可控制。
TCP 會精準(zhǔn)記錄哪些數(shù)據(jù)發(fā)送了,哪些數(shù)據(jù)被對方接收了,哪些沒有被接收到,而且保證數(shù)據(jù)包按序到達,不允許半點差錯。這是有狀態(tài)。
當(dāng)意識到丟包了或者網(wǎng)絡(luò)環(huán)境不佳,TCP 會根據(jù)具體情況調(diào)整自己的行為,控制自己的發(fā)送速度或者重發(fā)。這是可控制。
相應(yīng)的,UDP 就是無狀態(tài), 不可控的。
面向字節(jié)流:UDP 的數(shù)據(jù)傳輸是基于數(shù)據(jù)報的,這是因為僅僅只是繼承了 IP 層的特性,而 TCP 為了維護狀態(tài),將一個個 IP 包變成了字節(jié)流。
舉個例子就是說,我們的視頻通話就是使用UDP協(xié)議來盡最大能力讓你聽完,不管有的沒的;而下載文件就是TCP,一定要保障文件的完整性。
TCP和UDP的聯(lián)系
首先TCP和UDP都是運輸層的協(xié)議,然后他們都是建立在IP之上,TCP是交流式套接字,而UDP是報文套接字。
網(wǎng)絡(luò)字節(jié)序和主機字節(jié)序的轉(zhuǎn)換函數(shù)實踐
代碼如下:
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(2130706689);
先是定義了一個IP地址結(jié)構(gòu)體addrSrv,然后初始化它的IP時addrSrv.sin_addr.S_un.S_addr必須是賦值IP地址的網(wǎng)絡(luò)字節(jié)序,htonl函數(shù)的作用是把一個主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序,也就是上面轉(zhuǎn)換過程中第二步轉(zhuǎn)換為第三步的作用,127.0.1.1的主機字節(jié)序是21307066689,把主機字節(jié)序2130706433轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序就是htonl(2130706689)=16842879,所以如果你知道網(wǎng)絡(luò)字節(jié)序是16842879的話,addrSrv.sin_addr.S_un.S_addr=htonl(2130706689);與addrSrv.sin_addr.S_un.S_addr=16777689;是完全一樣的。
addrSrv.sin_addr.S_un.S_addr=htonl(2130706689);這句還可以寫為:
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.1.1"); 結(jié)果是完全一樣的。
可見inet_addr函數(shù)的轉(zhuǎn)換作用就是上面的第一步到第三步的轉(zhuǎn)換。
然后就是端口的主機字節(jié)序和網(wǎng)絡(luò)字節(jié)序也是同理,端口號就是主機字節(jié)序,先把端口轉(zhuǎn)成16位的二進制數(shù),然后把前八個和和八個調(diào)換位置在轉(zhuǎn)成十進制就是網(wǎng)絡(luò)字節(jié)序。
浙公網(wǎng)安備 33010602011771號