TCP和UDP的區別與聯系以及網絡字節序和主機字節序的轉換函數實踐

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

    推薦閱讀