ISO/OSI模型 VS TCP/IP模型
ISO/OSI模型是一種理論模型,TCP/IP模型是實際使用的一種模型
- TCP: Transmission Control Protocol,傳輸控制協議,類似於打電話
- UDP: User Datagram Protocol,用戶數據報協議,類似於寫信
- IP: Internet Protocol互聯網協議,是上述兩種協議的底層協議
IP地址(IP Address)
該設備在互聯網中的唯一標識, 本質就是由32位二進制組成的整數(0~4294967295)(ipv4),也有128位二進制組成的整數(ipv6),日常生活中, 采用點分十進制表示法來描述IP地址, 就是將每個字節的二進制轉換為一個十進制的整數, 不同的整數之間用小數點分隔0x01020304 => 1.2.3.4(整數=>字符串)
IP地址==網絡地址+主機地址, 根據網絡地址和主機地址的位數不同,分為以下4類
A類:0+7位網絡地址+24位主機地址
B類:10+14位網絡地址+16位主機地址
C類:110+21位網絡地址+8位主機地址
D類:1110+28位多播地址
- 網絡地址位數越多, 網絡個數越多, 但是每個網絡的主機個數比較少
- 當下的技術為了延長ipv4的使用壽命, 這種分類已經不適用了
端口號(Port Number)
網絡編程需要提供: IP地址+端口號
IP地址(IP Address) :可以定位到具體的某台設備中
端口號(port number) :可以定位到具體的某個進程中,端口號是unsigned short, So 表示的范圍是0~65535, 其中0~1024之間的端口號被系統占用, 因此編程中需要從1025起開始使用
字節序(byte order):
小端系統 :將低位數據存放在低位內存地址的系統
大端系統 :將低位數據存放在高位內存地址的系統
eg:對於數據0x12345678:
小端系統按照地址從小到大依次存放次序:0x78,0x56,0x34,0x12 (是78而不是87是因為最小單位是byte)
大端系統按照地址從小到大依次存放次序:0x12,0x34,0x56,0x78
- 為了實現不同主機之間的通信, 一般會將所有發送到網絡中的多字節整數先轉換為網絡字節序再發送, 而將所有從網絡中接受到的多字節整數先轉換為主機字節序(本機)再解析, 而網絡字節序本質就是大端系統的字節序
tcp
Transmission Control Protocol:
- 面向連接:類似打電話,電話不通就不說話, 建立連接進行通信斷開連接, so 整個通信的過程中全程保持連接
- 可靠:每發一個數據包都會等待接收方的反饋信息, 如果沒有反饋,就認為沒收到,就再發一遍, 數據的接受方會實時地通知發送方還可以接收的數據大小, 避免造成緩沖區的溢出現象
- 有序:為數據包每個字節都編號, 如果收到的順序是亂的, 可以根據數據的編號進行重新排序, 這樣就保證了收到的數據的順序和發的時候一樣
- 全雙工的字節流通信:用字節流的通信方式需要接受方手動解碼才能得到正確的含義,eg: 用4byte發送一個int,接收方收到的是4個1byte,所以需要手動解碼 //字節流: 以字節為單位不斷傳輸數據
- 服務器壓力大, 資源消耗比較高, 效率比較低連著, 不說話, 就會浪費資源;接收方不反饋的話就會一直發
幾種常見的解碼方法
- 約定5byte一個包, 每次都解碼5byte的長度
- 用特殊符號(eg: $)在發送時把數據切開
- 每個數據包的前端都帶上這個數據包的大小
udp
User Datagram Protocol:
- 非面向連接: 類似於寫信, 寫好就發, 不管收沒收到, 在通信的整個過程中不需要全程保持連接;
- 不保證數據傳遞的可靠性, 不需要接收方的反饋, 數據接受方也不會實時通知數據發送方還可以發送的數據大小
- 不保證數據傳遞的有序性
- 也是一種全雙工的數據報通信方式
- 服務器的壓力比較小, 資源消耗比較低, 發送的效率比較高
Note: 數據報 VS 字節流: 數據報是用水桶打水, 字節流是水管)