電腦網路高頻面試題02、03
02、TCP與UDP的聯繫與區別
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


