常用的各種網絡協議概念關係整理

本文理清網絡開發相關知識。包括各種協議之間的關係。

0x01 TCP/IP協議

TCP/IP協議是一個協議簇。裏面包括很多協議的。包括UDP,TCP,IP協議。

TCP/IP協議集包括應用層,傳輸層,網絡層,網絡訪問層。

這裏寫圖片描述

應用層

  • 超文本傳輸協議(HTTP):萬維網的基本協議.
  • 文件傳輸(TFTP簡單文件傳輸協議):
  • 遠程登錄(Telnet),提供遠程訪問其它主機功能,它允許用戶登錄 internet主機,並在這臺主機上執行命令.
  • 網絡管理(SNMP簡單網絡管理協議),該協議提供了監控網絡設備的方法,以及配置管理,統計信息收集,性能管理及安全管理等.
  • 域名系統(DNS),該系統用於在internet中將域名及其公共廣播的網絡節點轉換成IP地址.

運輸層

  • TCP 傳輸控制協議
  • UDP 用戶數據報協議

網絡層

處理分組在網絡中的活動,如分組的選路;網絡層的協議包括

  • IP協議
  • ICMP協議(Internet互聯網控制報文協議)
  • IGMP協議(Internet組管理協議)

鏈路層

也稱數據鏈路層或網絡接口層,包括設備驅動程序和網絡接口卡,它們一起處理與電纜的物理接口細節。鏈路層主要有三個目的

  • 爲IP模塊發送和接受IP數據
  • 爲ARP模塊發送ARP請求和接受ARP應答
  • 外RARP發送RARP請求和接受RARP應答

0x02 IP協議

IP協議是TCP/IP協議的核心,所有的TCP,UDP,IMCP,IGCP的數據都以IP數據格式傳輸。要注意的是,IP不是可靠的協議,這是說,IP協議沒有提供一種數據未傳達以後的處理機制–這被認爲是上層協議–TCP或UDP要做的事情。

下圖是IP頭部結構,20個字節

這裏寫圖片描述

0x03 TCP協議

TCP(Transmission Control Protocol,傳輸控制協議)

是面向連接的協議,也就是說,在收發數據前,必須和對方建立可靠的連接。

TCP三次握手過程

  1. 主機A通過向主機B 發送一個含有同步序列號的標誌位的數據段給主機B ,向主機B 請求建立連接,通過這個數據段,主機A告訴主機B 兩件事:我想要和你通信你可以用此序列號作爲起始數據段來回應我.
  2. 主機B收到主機A的請求後,用一個帶有確認應答(ACK)和同步序列號(SYN)標誌位的數據段響應主機A,也告訴主機A兩件事:我已經收到你的請求了,你可以傳輸數據了你要用此序列號作爲起始數據段來回應我
  3. 主機A收到這個數據段後,再發送一個確認應答,確認已收到主機B的數據段:我已收到回覆,我現在要開始傳輸實際數據了

TCP斷開連接四次握手

  1. 當主機A完成數據傳輸後,將控制位FIN置1,提出停止TCP連接的請求
  2. 主機B收到FIN後對其作出響應,確認這一方向上的TCP連接將關閉,將ACK置1
  3. 由B 端再提出反方向的關閉請求,將FIN置1
  4. 主機A對主機B的請求進行確認,將ACK置1,雙方向的關閉結束.

由TCP的三次握手和四次斷開可以看出,TCP使用面向連接的通信方式,大大提高了數據通信的可靠性,使發送數據端和接收端在數據正式傳輸前就有了交互,爲數據正式傳輸打下了可靠的基礎.

TCP頭部結構

這裏寫圖片描述

0x04 UDP協議

UDP(User Data Protocol,用戶數據報協議)

UDP是一個簡單的面向數據報的傳輸層協議。

UDP頭部結構

這裏寫圖片描述

0x05 TCP與UDP的區別

  1. TCP基於連接,UDP無連接
  2. TCP需要較多系統資源,UDP需要較少系統資源
  3. TCP程序結構較複雜,UDP程序結構簡單
  4. TCP流模式,UDP數據報模式
  5. TCP保證數據正確性,UDP更容易丟包
  6. TCP保證數據順序,UDP不保證數據順序

0x06 遊戲中的長短連接

短連接
連接->傳輸數據->關閉連接
HTTP是無狀態的,瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。
也可以這樣說:短連接是指 Socket 連接後發送後接收完數據後馬上斷開連接。

長連接
連接->傳輸數據->保持連接 -> 傳輸數據-> 。。。 ->關閉連接。
長連接指建立 Socket 連接後不管是否使用都保持連接,但安全性較差。

0x07 Socket

socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用接口(API),
通過Socket,我們才能使用TCP/IP協議。
實際上,Socket跟TCP/IP協議沒有必然的聯繫。Socket編程接口在設計的時候,就希望也能適應其他的網絡協議。
所以說,Socket的出現只是使得程序員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,
從而形成了我們知道的一些最基本的函數接口,比如create、 listen、connect、accept、send、read和write等等

socket的抽象層位於應用層和運輸層之間。

TCP編程的服務器端一般步驟:
1. 創建一個socket,用函數socket();
2. 設置socket屬性,用函數setsockopt(); * 可選
3. 綁定IP地址、端口等信息到socket上,用函數bind();
4. 開啓監聽,用函數listen();
5. 接收客戶端上來的連接,用函數accept();
6. 收發數據,用函數send()和recv(),或者read()和write();
7. 關閉網絡連接;
8. 關閉監聽;

TCP編程的客戶端一般步驟:
1. 創建一個socket,用函數socket();
2. 設置socket屬性,用函數setsockopt();* 可選
3. 綁定IP地址、端口等信息到socket上,用函數bind();* 可選
4. 設置要連接的對方的IP地址和端口等屬性;
5. 連接服務器,用函數connect();
6. 收發數據,用函數send()和recv(),或者read()和write();
7. 關閉網絡連接;

UDP編程的服務器端一般步驟:
1. 創建一個socket,用函數socket();
2. 設置socket屬性,用函數setsockopt();* 可選
3. 綁定IP地址、端口等信息到socket上,用函數bind();
4. 循環接收數據,用函數recvfrom();
5. 關閉網絡連接;

UDP編程的客戶端一般步驟:
1. 創建一個socket,用函數socket();
2. 設置socket屬性,用函數setsockopt();* 可選
3. 綁定IP地址、端口等信息到socket上,用函數bind();* 可選
4. 設置對方的IP地址和端口等屬性;
5. 發送數據,用函數sendto();
6. 關閉網絡連接;

0x08 Http協議

HTTP協議即超文本傳送協議(HypertextTransfer Protocol)是一個基於請求與響應模式的、無狀態的、應用層的協議,通常基於TCP協議之上。

HTTP請求

由三部分組成:請求行、消息報頭、請求正文

請求行格式 Method Request-URI HTTP-Version CRLF

  • Method表示請求方法
  • Request-URI是一個統一資源標識符
  • HTTP-Version表示請求的HTTP協議版本
  • CRLF表示回車和換行(除了作爲結尾的CRLF外,不允許出現單獨的CR或LF字符)

請求方法(所有方法全爲大寫)有多種,各個方法的解釋如下:
GET 請求獲取Request-URI所標識的資源
POST 在Request-URI所標識的資源後附加新的數據
HEAD 請求獲取由Request-URI所標識的資源的響應消息報頭
PUT 請求服務器存儲一個資源,並用Request-URI作爲其標識
DELETE 請求服務器刪除Request-URI所標識的資源
TRACE 請求服務器回送收到的請求信息,主要用於測試或診斷
CONNECT 保留將來使用
OPTIONS 請求查詢服務器的性能,或者查詢與資源相關的選項和需求

HTTP響應也由三個部分組成:

狀態行、消息報頭、響應正文

狀態行格式 HTTP-Version Status-Code Reason-Phrase CRLF

  • HTTP-Version表示服務器HTTP協議的版本;
  • Status-Code表示服務器發回的響應狀態代碼;
  • Reason-Phrase表示狀態代碼的文本描述。

狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值

1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:服務器端錯誤--服務器未能實現合法的請求

HTTP消息報頭(之後文章詳解,此處不做說明)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章