Internet網(wǎng)的主機(jī)通信
在
Internet
網(wǎng)里面主機(jī)想通信來傳輸數(shù)據(jù),在他們通信連接每一端,和進(jìn)程間的傳輸要有兩個(gè)標(biāo)志一是IP地址,二是端口號(hào)诈火,我們合稱為套接字地址
socket address
客戶機(jī)套接字地址定義了唯一的客戶進(jìn)程
服務(wù)器套接字地址定義了一個(gè)唯一的服務(wù)器進(jìn)程
但是進(jìn)程間通信只是其中一種,還有發(fā)信號(hào)通信状答,還有共享內(nèi)存等
IP地址來標(biāo)識(shí)主機(jī)(也就是區(qū)分主機(jī))冷守,端口號(hào)來標(biāo)識(shí)進(jìn)程(也就是區(qū)分進(jìn)程)
把他們連起來就可以標(biāo)識(shí)網(wǎng)絡(luò)當(dāng)中的唯一的進(jìn)程或主機(jī)了
通過IP地址找到主機(jī),端口號(hào)來找到進(jìn)程惊科,之后在來通信
socket 套接字
- Socket: 套接字拍摇,進(jìn)程間通信 IPC 的一種實(shí)現(xiàn),允許位于不同主機(jī)(或同一主機(jī))上不同進(jìn)程之間進(jìn)行通信和數(shù)據(jù)交換馆截, SocketAPI 出現(xiàn)于 1983 年充活, 4.2 BSD 實(shí)現(xiàn)
- Socket API :封裝了內(nèi)核中所提供的 socket 通信相關(guān)的系統(tǒng)調(diào)用
- Socket Domain :根據(jù)其所使用的地址
- AF_INET : Address Family , IPv4
- AF_INET6 : IPv6
- AF_UNIX :同一主機(jī)上不同進(jìn)程之間通信時(shí)使用 :這是本機(jī)通信的Socket
- Socket Type :根據(jù)使用的傳輸層協(xié)議
- SOCK_STREAM :流, tcp 套接字混卵,可靠地傳遞映穗、面向連接
- SOCK_DGRAM :數(shù)據(jù)報(bào), udp 套接字淮菠,不可靠地傳遞男公、無連接
- SOCK_RAW: 裸套接字 , 無須 tcp 或 tdp,APP 直接通過 IP 包通信
- 上圖以套接字為分割線荤堪,下四層關(guān)系的是怎么在網(wǎng)絡(luò)中傳輸數(shù)據(jù)合陵,這表示下四層都是用內(nèi)核來控制的不是操作系統(tǒng)來控制
- 物理層,連接網(wǎng)絡(luò)設(shè)備的
- 數(shù)據(jù)鏈路層澄阳,關(guān)系的是鏈路傳輸拥知,如MAC地址
- 網(wǎng)絡(luò)層,如路由碎赢、IP等等
- 傳輸層低剔,如端口號(hào)
- 程序是工作在應(yīng)用層,操作系統(tǒng)內(nèi)核是工作在內(nèi)核層
- 所以應(yīng)用層關(guān)系的是應(yīng)用的細(xì)節(jié)肮塞,內(nèi)核關(guān)系的是通信的細(xì)節(jié)
上圖所表述的是基本 TCP 客戶 / 服務(wù)器程序的套接字函數(shù)
TCP服務(wù)端首先用
socket
套接字來創(chuàng)建個(gè)socket
來襟齿,然后用dind
來綁定IP或端口來自己指定,接著就開始監(jiān)聽了listen
,就開始打開端口了枕赵,來讓別人來訪問accept
執(zhí)行完以后他就可以接收外部的連接假如這時(shí)候有一個(gè)客戶端猜欺,他也創(chuàng)建了
socket
套接字,不過可能IP和端口是隨機(jī)的拷窜,然后通過connect
來建立連接服務(wù)器這時(shí)候客戶端和服務(wù)器端就有數(shù)據(jù)進(jìn)行交換了
通常來說客戶端會(huì)通過
write
這樣的函數(shù)來寫數(shù)據(jù)开皿,寫好以后在傳給服務(wù)端,服務(wù)器接收到數(shù)據(jù)以后篮昧,會(huì)用read
這個(gè)函數(shù)來讀數(shù)據(jù)赋荆,數(shù)據(jù)讀取完成以后就開始處理客戶端的請(qǐng)求,然后也開始寫數(shù)據(jù)懊昨,在傳回給客戶端客戶端接收到數(shù)據(jù)以后窄潭,也會(huì)讀,然后在寫酵颁,以此循環(huán)
如果數(shù)據(jù)處理完畢以后客戶端會(huì)用
close
函數(shù)來結(jié)束連接在里面用到了一些系統(tǒng)調(diào)用狈孔,在不同的語言里面,都有不同的開發(fā)庫
-
套接字相關(guān)的系統(tǒng)調(diào)用:
- socket(): 創(chuàng)建一個(gè)套接字
- bind() :綁定 IP 和端口
- listen() :監(jiān)聽
- accept() :接收請(qǐng)求
- connect() :請(qǐng)求連接建立
- write() :發(fā)送
- read() :接收
- close(): 關(guān)閉連接