電腦網路高頻面試題02、03

02、TCP與UDP的聯繫與區別

TCP與UDP的聯繫

  • TCP/IP協議集包括應用層,傳輸層,網路層,網路訪問層。
  • TCP/IP協議里,有兩個具有代表性的傳輸層協議,分別就是 TCP 和 UDP。

TCP與UDP的區別

  TCP UDP
可靠性 可靠 不可靠
連接性 面向連接 無連接
首部開銷 20位元組 8位元組
報文 面向位元組流 面向報文
效率 傳輸效率低 傳輸效率高
雙工性 全雙工 一對一、一對多、多對一、多對多
流量控制 滑動窗口
擁塞控制 慢開始、擁塞避免、快重傳、快恢復

傳輸速度

應用場景

對效率要求低,對準確性要求高或者要求有連接的場景 對效率要求高,對準確性要求低

TCP

  • TCP是面向連接的、可靠的流協議。它可以保證兩端通訊主機之間的通訊可達。TCP能夠正確處理在傳輸過程中的丟包、傳輸順序亂掉等異常情況。此外,TCP還能夠有效利用頻寬,緩解網路擁堵。
  • TCP為了建立與斷開連接,正常過程至少需要來回發送7個包才能完成
  • TCP用於在傳輸層有必要實現可靠傳輸的情況。由於它是面向有連接並具備順序控制、重發控制等機制的,所以它可以為應用提供可靠傳輸。
  • TCP只能是一對一通訊。

UDP

  • UDP面向無連接,是不具有可靠性的數據報協議。在UDP的情況下,雖然可以確保發送消息的大小,卻不能保證消息一定會到達。
  • UDP主要用於那些對高速傳輸和實時性有較高要求的通訊或廣播通訊。
  • UDP支援一對一,一對多,多對一和多對多交互通訊。

03、網路位元組序與主機位元組序的轉換函數實踐。

  • 主機位元組序,即CPU存儲數據時採用的位元組順序。不同的CPU設計時採用的位元組序是不同的,談到位元組序的問題,必然牽涉到兩大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86與x86_64(該指令集由AMD率先設計推出)系列CPU。PowerPC系列採用big endian方式存儲數據,而x86與x86_64系列則採用little endian方式存儲數據。平常大多數PC與伺服器如果使用的是Intel與AMD CPU,一般都是little endian。

  • 網路位元組序,是TCP/IP中規定好的一種數據表示格式,它與具體的CPU類型、作業系統等無關,從而可以保證數據在不同主機之間傳輸時能夠被正確解釋。網路位元組順序採用big endian排序方式。

網路位元組序與主機位元組序的相互轉換

  • 常用系統調用

  Linux socket網路編程中,經常會使用下面四個C標準庫函數進行位元組序間的轉換。

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);        //把uint32_t類型從主機序轉換到網路序
uint16_t htons(uint16_t hostshort);        //把uint16_t類型從主機序轉換到網路序
uint32_t ntohl(uint32_t netlong);        //把uint32_t類型從網路序轉換到主機序
uint16_t ntohs(uint16_t netshort);        //把uint16_t類型從網路序轉換到主機序
  • 64位數值的轉換

//主機序轉網路序
unsigned long long htonll(unsigned long long val)
{
    if(__BYTE_ORDER == __LITTLE_ENDIAN)  
    {
         return (((unsigned long long )htonl((int)((val << 32) >> 32))) << 32) | (unsigned int)htonl((int)(val >> 32));  
    }  
    else if (__BYTE_ORDER == __BIG_ENDIAN)  
    {  
         return val;  
    }  
}  

//網路序轉主機序
unsigned long long ntohll(unsigned long long val)  
{  
    if (__BYTE_ORDER == __LITTLE_ENDIAN)
    {
        return (((unsigned long long )ntohl((int)((val << 32) >> 32))) << 32) | (unsigned int)ntohl((int)(val >> 32));  
    }  
    else if (__BYTE_ORDER == __BIG_ENDIAN)  
    {  
        return val;  
    }
 }
  • 實踐

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);//<主機位元組序轉換位網路位元組序32,轉換IP地址時用>
uint16_t htons(uint16_t hostshort);//<主機位元組序16位轉換為網路位元組序16位,轉換埠時用>

uint32_t ntohl(uint32_t netlong);//<網路位元組序32位轉換為主機位元組序32,讀的時候會涉及>
uint16_t ntohs(uint6_t netshort)//<網路位元組序16位轉換位16位主機位元組序,同上>

//IP地址轉換函數;
#include <arpa/inet.h>
int inet_pton(int af,const charsrc,chardst);//192.168.1.24----->網路位元組序
const char* inet_ntop(int af,const voidsrc,char dst,socklen_tsize);//網路位元組序—》點分十進位字元串IP;
//參數af:如果時IPv4,選AF_INET,IPV6選擇AF_INET6;

轉載://blog.csdn.net/K346K346/article/details/79053136