網(wǎng)絡(luò)編程與TCP/IP協(xié)議
網(wǎng)絡(luò)編程與TCP/IP協(xié)議
一、網(wǎng)絡(luò)分層模型
1. OSI七層模型(理論模型)
| 層級 | 名稱 | 功能 | 數(shù)據(jù)單元 |
|---|---|---|---|
| 7 | 應(yīng)用層 | 為應(yīng)用程序提供網(wǎng)絡(luò)服務(wù) | 數(shù)據(jù)(data) |
| 6 | 表示層 | 數(shù)據(jù)的格式化和轉(zhuǎn)換 | 數(shù)據(jù)(data) |
| 5 | 會話層 | 建立、管理、終止會話 | 數(shù)據(jù)(data) |
| 4 | 傳輸層 | 提供端到端的數(shù)據(jù)傳輸 | 段/數(shù)據(jù)報 |
| 3 | 網(wǎng)絡(luò)層 | 路徑選擇和路由,IP尋址 | 數(shù)據(jù)包 |
| 2 | 數(shù)據(jù)鏈路層 | 設(shè)備間傳輸數(shù)據(jù)幀,物理尋址 | 幀 |
| 1 | 物理層 | 定義物理介質(zhì)和電氣特性 | 比特 |
2. TCP/IP模型(實際應(yīng)用)
| 層級 | 協(xié)議 | 功能 |
|---|---|---|
| 應(yīng)用層 | HTTP、FTP、DNS | 應(yīng)用程序通信 |
| 傳輸層 | TCP、UDP | 端到端數(shù)據(jù)傳輸 |
| 網(wǎng)絡(luò)層 | IP | 路由和尋址 |
| 網(wǎng)絡(luò)接口層 | 以太網(wǎng)、WiFi | 物理傳輸 |
網(wǎng)絡(luò)連接要素:網(wǎng)絡(luò)設(shè)備 + 傳輸介質(zhì)
二、TCP協(xié)議詳解
TCP三大核心特點
- 面向連接:通信前必須經(jīng)過"三次握手",結(jié)束后必須經(jīng)過"四次揮手"
- 可靠傳輸:基于序號確認(rèn)、超時重傳、流量控制機制
- 面向字節(jié)流:不保留邊界信息,將數(shù)據(jù)切分成TCP段
關(guān)鍵機制
三次握手(建立連接)
- 客戶端發(fā)送SYN請求連接
- 服務(wù)器回復(fù)SYN+ACK確認(rèn)
- 客戶端發(fā)送ACK應(yīng)答,連接建立完成
四次揮手(斷開連接)
- 主動方發(fā)送FIN請求關(guān)閉
- 被動方回ACK確認(rèn)收到
- 被動方發(fā)送FIN請求關(guān)閉
- 主動方回復(fù)ACK,連接關(guān)閉
三、TCP編程相關(guān)結(jié)構(gòu)體
sockaddr_in結(jié)構(gòu)
struct sockaddr_in {
sa_family_t sin_family; // 地址族
in_port_t sin_port; // 端口號(網(wǎng)絡(luò)字節(jié)序/大端)
struct in_addr sin_addr; // IPv4地址(網(wǎng)絡(luò)字節(jié)序/大端)
};
struct in_addr {
uint32_t s_addr; // IPv4地址
};
字節(jié)序說明
- 主機字節(jié)序:根據(jù)不同CPU架構(gòu),存儲多字節(jié)的方式不同
- 網(wǎng)絡(luò)字節(jié)序:統(tǒng)一標(biāo)準(zhǔn),采用大端序,保證不同計算機通信
四、TCP服務(wù)器編程流程
1. 創(chuàng)建套接字
int socket(int domain, int type, int protocol);
2. 綁定地址
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
// addrlen: 結(jié)構(gòu)體大小,通常使用sizeof獲取
3. 監(jiān)聽連接
int listen(int sockfd, int backlog);
// backlog: 連接請求隊列的最大長度
作用:將未連接的套接字轉(zhuǎn)換為被動套接字,監(jiān)聽客戶端連接請求
4. 接受連接
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
返回值:成功返回新的套接字文件描述符,失敗返回-1
作用:從等待隊列中取出第一個連接請求,創(chuàng)建新套接字與客戶端連接
套接字類型說明
-
監(jiān)聽套接字:
- 由socket()創(chuàng)建,bind()綁定,listen()監(jiān)聽
- 被動角色,只接受連接請求
- 生命周期:整個服務(wù)器程序執(zhí)行時間
-
連接套接字:
- 由accept()返回創(chuàng)建
- 主動角色,專門與特定客戶端通信
- 生命周期:與客戶端連接結(jié)束后關(guān)閉
5. 數(shù)據(jù)接收
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
返回值:
- >0:實際接收的字節(jié)數(shù)
- =0:連接已關(guān)閉
- =-1:失敗
6. 數(shù)據(jù)發(fā)送
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
7. 關(guān)閉連接
int close(int fd);
五、TCP客戶端編程
連接服務(wù)器
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
返回值:
- 0:連接已建立
- -1:連接失敗
作用:主動向服務(wù)器發(fā)起連接請求,自動觸發(fā)三次握手
六、協(xié)議對比
| 特性 | TCP | UDP | HTTP |
|---|---|---|---|
| 連接性 | 面向連接 | 無連接 | 應(yīng)用層協(xié)議 |
| 可靠性 | 可靠傳輸 | 不可靠 | 基于TCP |
| 速度 | 較慢 | 較快 | 中等 |
| 數(shù)據(jù)邊界 | 字節(jié)流 | 數(shù)據(jù)報 | 消息 |
| 使用場景 | 文件傳輸、網(wǎng)頁 | 視頻流、DNS | Web應(yīng)用 |

浙公網(wǎng)安備 33010602011771號