本文理清網絡開發相關知識。包括各種協議之間的關係。
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三次握手過程
- 主機A通過向主機B 發送一個含有同步序列號的標誌位的數據段給主機B ,向主機B 請求建立連接,通過這個數據段,主機A告訴主機B 兩件事:我想要和你通信 和 你可以用此序列號作爲起始數據段來回應我.
- 主機B收到主機A的請求後,用一個帶有確認應答(ACK)和同步序列號(SYN)標誌位的數據段響應主機A,也告訴主機A兩件事:我已經收到你的請求了,你可以傳輸數據了 和 你要用此序列號作爲起始數據段來回應我
- 主機A收到這個數據段後,再發送一個確認應答,確認已收到主機B的數據段:我已收到回覆,我現在要開始傳輸實際數據了
TCP斷開連接四次握手
- 當主機A完成數據傳輸後,將控制位FIN置1,提出停止TCP連接的請求
- 主機B收到FIN後對其作出響應,確認這一方向上的TCP連接將關閉,將ACK置1
- 由B 端再提出反方向的關閉請求,將FIN置1
- 主機A對主機B的請求進行確認,將ACK置1,雙方向的關閉結束.
由TCP的三次握手和四次斷開可以看出,TCP使用面向連接的通信方式,大大提高了數據通信的可靠性,使發送數據端和接收端在數據正式傳輸前就有了交互,爲數據正式傳輸打下了可靠的基礎.
TCP頭部結構
0x04 UDP協議
UDP(User Data Protocol,用戶數據報協議)
UDP是一個簡單的面向數據報的傳輸層協議。
UDP頭部結構
0x05 TCP與UDP的區別
- TCP基於連接,UDP無連接
- TCP需要較多系統資源,UDP需要較少系統資源
- TCP程序結構較複雜,UDP程序結構簡單
- TCP流模式,UDP數據報模式
- TCP保證數據正確性,UDP更容易丟包
- 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:服務器端錯誤--服務器未能實現合法的請求