2-1:套接字(Socket)编程之必备知识
文章目錄
- (1)IP地址和端口號
- A:源IP地址和目的IP地址
- B:端口號
- (2)TCP
- (3)UDP
- (4)網絡字節序
仔細觀察可以發現,主機與主機完成網絡通信本質其實進程間通信,例如我們使用QQ相互發送消息以及訪問百度服務器查詢關鍵詞等等。
對于同一臺主機的兩個進程,要完成通信,方法有很多種,例如管道,共享內存等。而不同主機的兩個繼承想要完成通信則必須要通過網絡,其中有一個非常關鍵的問題就是如果把一個主機的數據發送到另一個數據,這就需要IP地址,發送過去之后,一個主機上又有可能運行多個進程,如何準確讓QQ這個進程接受呢,這就需要端口號 。所以說,IP+端口號標識了全網唯一的進程
(1)IP地址和端口號
A:源IP地址和目的IP地址
前文說過:IP地址用于標識公網中某一個臺主機
所以它能確保數據準確發送給目的主機
B:端口號
在傳輸層中也有類似于IP地址和MAC地址的概念,它就是端口號,端口號用來確定應該將數據交付給哪一個應用程序
我們都知道所有進程都需要一個PID來進行表示,但是不是所有的進程都是網絡進程,所以不是所有進程都需要端口號。
同時一個進程可以綁定多個端口號(就像學生在學??梢杂袑W號,在健身房可以有會員號),但是一個端口號不能被多個進程綁定
(2)TCP
為了實現數據的可靠傳輸,需要考慮很多的事情,比如數據是否被破壞,丟包以及分片順序混亂等問題
所以TCP通過校驗和,序列號確認應答,重發控制,連接管理以及窗口控制等機制實現可靠性傳輸
(3)UDP
UDP和TCP不一樣,它不提供復雜的控制機制,它的主要職責就是發送,數據丟包不丟包,接受沒有接受和它沒有一點關系
(4)網絡字節序
我們知道數據才內存中存放時有大端和小端之分
而在網絡數據流中,也有大小端之分。TCP/IP協議規定,網絡數據流應該采用大端字節序,即低地址高字節
無論一臺主機是大端還是小端機,都要按照這個規定來發送數據,如果當前主機是小端就要將小端轉為大端,然后從內存的低地址到高地址發送數據,接收方也是按照從低到高的順序接受
這樣做很大的優點就是數據在傳輸的同時就可以做運算了,如果是小端的話就必須要等待所有數據全部就為了才可以開始操作
所以為了更加方便操作,C中也提供了相應的接口以供主機字節序和網絡字節序間的轉換
#include <arpa/inet.h>/* 32位整數從主機字節序轉換為網絡字節序 */ uint32_t htonl(uint32_t hostlong); /* 16位整數從主機字節序轉換為網絡字節序 */ uint16_t htons(uint16_t hostshort); /* 32位整數從網絡字節序轉換為主機字節序 */ uint32_t ntohl(uint32_t netlong); /* 16位整數從網絡字節序轉換為主機字節序 */ uint16_t ntohs(uint16_t netshort);- 其中h表示host,n表示network,l表示32位長整數,s表示16位短整數
- 如果主機是小端字節序,這些函數將參數做相應的大小端轉換然后返回;如果是大端字節序則不作修改,直接返回
總結
以上是生活随笔為你收集整理的2-1:套接字(Socket)编程之必备知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL基础 (DML)
- 下一篇: java继承覆盖总结