一、網路協議 國際標準化組織(ISO)定義了網路協議的基本框架,被稱為OSI模型。OSI模型包括應用層、表示層、會話層、傳輸層、網路層、數據鏈路層及物理層。而OSI模型過於複雜至今沒有得到實際的應用。 TCP/IP協議模型將OSI的7層協議模型簡化為4層,從而更有利於實現和使用。TCP/IP協議模型 ...
一、網路協議
國際標準化組織(ISO)定義了網路協議的基本框架,被稱為OSI模型。OSI模型包括應用層、表示層、會話層、傳輸層、網路層、數據鏈路層及物理層。而OSI模型過於複雜至今沒有得到實際的應用。
TCP/IP協議模型將OSI的7層協議模型簡化為4層,從而更有利於實現和使用。TCP/IP協議模型包括應用層、傳輸層、網路層、網路介面層。
TCP/IP協議與OSI模型的對應關係如下圖:
二、套接字socket
它是一種可以進行網路通信的內核對象,它有一個唯一的標識符,一般稱它為socket描述符,跟文件描述符類似,也可以用read/wrote/close操作。
int socket(int domain, int type, int protocol);/* 功能:創建socket對象 domain:通信地址類型 AF_UNIX / AF_LOCAL :本地進程間通信 AF_INET :使用ipv4地址通信 AF_INET6:使用ipv6地址通信 type: SOCK_STREAM :數據流協議,TCP面向連接的通信協議 優點:安全可靠,數據不丟失,但速度慢。 一般常用於安全性較高的場景 SOCK_DGRAM :數據報協議,UDP面向無連接的通信協議 優點:速度快,數據可能會丟失,安全性和可靠性於TCP相比不高 一般用於安全性要求不高,但對速度有要求的場景。 protocol:特殊協議一般不使用,直接寫 0*/
準備通信地址:
基本通信地址
struct sockaddr
{
sa_family_t sa_family;
char sa_data[14];
}
本地通信地址
struct sockaddr_un
{
// 通信地址類型
sun_family_t sun_family;
// socket文件的路徑
char sun_path[100];
}
網路通信地址
struct sockaddr_in
{
//通信地址類型
short int sin_family;
//埠號
in_port_t sin_port;
//ip地址
struct in_addr sin_addr;
}
準備好的通信地址通常要將其強制轉換成基本通信地址才能傳給函數使用。
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen); //功能:把socket對象與通信地址建立聯繫 int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen); //功能:連接通信目標 //socketaddr:目標地址
三、網路通信的數據存儲方式
個人電腦系統數據的存儲方式可能是大端,也可能是小端,網路通信時需要的是大端數據,必須把數據轉換成大端。
uint32_t htonl(uint32_t hostlong); //功能:把32位的主機位元組序轉換成32位的網路位元組序 uint16_t htons(uint16_t hostshort); //功能:把16位的主機位元組序轉換成16位的網路位元組序 uint32_t ntohl(uint32_t netlong); //功能:把32為網路位元組序轉換成32位的主機位元組序 uint16_t ntohs(uint16_t netshort); //功能:把16為網路位元組序轉換成16位的主機位元組序
生成埠號
埠號就是一個16為的無符號整數
uint16_t htons(uint16_t hostshort);
生成ip地址
in_addr_t inet_addr(const char *cp); //功能:把點分十進位的字元串ip地址轉換成32位的無符號整數 char *inet_ntoa(struct in_addr in); //功能:把32位的網路位元組序的ip地址轉換成點分十進位的字元串ip地址
四、網路通信(UDP)
進程A:創建socket對象->準備地址->綁定->接收數據和來時的地址->原路返回數據->關閉socket
進程B:創建socket對象->準備地址->向目標發送數據->接收數據->關閉socket
當socket對象被全部關閉後,會在內核中停留一段時間(給一個重新連接的機會),如果再使用同樣的ip地址和埠號時就會失敗(延時關閉)
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen); //功能:接收數據並獲取發送端的地址 //addrlen:是參數,要得到的src_addr的長度 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen); //功能:發送數據到指定的目標
五、網路通信(TCP)
面向連接的網路通信,在通信過程中時刻保持連接,這種通信方式類似與打電話,能保證安全可靠、數據不丟失,但與UDP相比傳輸速度略低。
進程A:創建socket->準備地址->綁定->監聽(設置隊列長度)->等待連接->通信->關閉。
進程B;創建socket->準備地址->連接->通信->關閉
int listen(int sockfd, int backlog); //功能:設置socket對象最大的排隊數量 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //功能:等待其他主機與當前socket建立連接關係。 //返回值:建立連接的描述符,此後通信都用此描述符 int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen); //功能:連接通信目標 //socketaddr:目標地址 ssize_t recv(int sockfd, void *buf, size_t len, int flags); //功能:網路通信專用的數據接收 //flag: 0 阻塞 // 1 不阻塞 //返回值:-1 時,說明連接斷開,此時應該結束迴圈 ssize_t send(int sockfd, const void *buf, size_t len, int flags); //功能:網路通信專用的數據發送 //返回值:-1 時,說明連接斷開 ,此時應該結束迴圈