計算機網絡高頻面試題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;

浙公網安備 33010602011771號