套接字(Socket)是一個抽象層谊娇,位于應(yīng)用層和傳輸層之間,將TCP/IP復(fù)雜的操作抽象出幾個簡單接口弥搞,供應(yīng)用層調(diào)用邮绿,實現(xiàn)網(wǎng)絡(luò)進(jìn)程之間的通信。
套接字實際是傳輸層連接的端點攀例,使用“IP地址:端口號”進(jìn)行唯一標(biāo)識船逮。在網(wǎng)絡(luò)通信中,套接字一定是成對出現(xiàn)的粤铭,兩個套接字組成的socket pair唯一標(biāo)識一個連接挖胃。一端的發(fā)送緩沖區(qū)對應(yīng)對方的接收緩沖區(qū)。使用同一個文件描述符檢索套接字的發(fā)送緩沖區(qū)和接收緩沖區(qū)。
網(wǎng)絡(luò)系統(tǒng)一般提供三種不同類型的套接字:
- 流式套接字(SOCK_STREAM):提供可靠的酱鸭、面向連接的雙向數(shù)據(jù)傳輸服務(wù)吗垮,使用TCP協(xié)議來實現(xiàn)。
- 數(shù)據(jù)報套接字(SOCK_DGRAM):提供不可靠凹髓、無連接的雙向數(shù)據(jù)傳輸服務(wù)烁登,使用UDP協(xié)議來實現(xiàn)。
- 原始套接字(SOCK_RAW):使用較低層協(xié)議(IP或ICMP)進(jìn)行直接訪問蔚舀。
Unix Socket通信流程如下:
socket():創(chuàng)建套接字饵沧。
bind():綁定本地地址。
很多時候赌躺,應(yīng)用程序不關(guān)心使用的本地地址狼牺,這時不用調(diào)用bind(),而由系統(tǒng)自動分配礼患。但在知名端口上操作的進(jìn)程必須指定本地端口是钥,這時就使用bind()為套接字指定本地地址。listen():監(jiān)聽連接請求缅叠。
connect():請求連接悄泥。
accept():接受連接。
read()/write():雙向通信痪署。
close():關(guān)閉套接字码泞。