先放程序源碼以及Python例子
網(wǎng)絡(luò)的基本知識
- 網(wǎng)絡(luò)一般有7層模型
- 每一層網(wǎng)絡(luò)從上至下分別將要發(fā)送的包進(jìn)行封裝,然后通過網(wǎng)線傳輸出去,解析的時候由下至上分別的進(jìn)行解包。
- TCP建立可靠的連接;UDP僅僅是發(fā)送報文,不管是否丟包。
- IP地址。如果要與一個服務(wù)器進(jìn)行通訊,需要服務(wù)器的ip地址,但若服務(wù)器主機在路由器的子網(wǎng)里面,則需要設(shè)置端口映射,讓IP所在的路由器某個端口映射到服務(wù)器主機。
- 應(yīng)用程序一般通過端口進(jìn)行數(shù)據(jù)傳輸。端口是一個虛擬的概念,在實際物理層次不存在。端口分為三類:
- 公認(rèn)端口:0-1023 綁定Binding一些特定服務(wù)
- 注冊端口:1024-49151 一般應(yīng)用程序使用綁定
- 動態(tài)或私有端口:49152-65535 應(yīng)用程序一般不會主動使用
- 一個端口可以建立多個socket進(jìn)行連接(服務(wù)器端一般是可以的)
- 目前的網(wǎng)絡(luò)編程模型主要是 客戶-服務(wù)器端結(jié)合(C/S)
Socket的基本知識
簡單來說,socket 是對底層網(wǎng)絡(luò)通信的一層抽象,讓程序員可以像文件那樣操作網(wǎng)絡(luò)上發(fā)送和接收的數(shù)據(jù)。
在Linux哲學(xué)里面,一切皆文件。那么可以將Socket理解為一個文件,應(yīng)用程序主要的功能就是從Socket(文件)中讀取和寫入數(shù)據(jù)。
http://www.bogotobogo.com/python/python_network_programming_server_client.php
socket 類型
創(chuàng)建 socket 的時候需要指定 socket 的類型,一般有三種:
-
SOCK_STREAM
:面向連接的穩(wěn)定通信,底層是 TCP 協(xié)議,我們會一直使用這個。 -
SOCK_DGRAM
:無連接的通信,底層是 UDP 協(xié)議,需要上層的協(xié)議來保證可靠性。 -
SOCK_RAW
:更加靈活的數(shù)據(jù)控制,能讓你指定 IP 頭部
術(shù)語表
名稱 | 含義 |
---|---|
socket | 創(chuàng)建一個通信的管道 |
bind | 把一個地址三元組綁定到 socket 上 |
listen | 準(zhǔn)備接受某個 socket 的數(shù)據(jù) |
accept | 等待連接到達(dá) |
connect | 主動建立連接 |
send | 發(fā)送數(shù)據(jù) |
receive | 接受數(shù)據(jù) |
close | 關(guān)閉連接 |
Socket通訊流程圖
Socket通訊流程圖
Http 和 Https
待補充