Linux网络协议栈(一)——Socket入门(1)
1、TCP/IP參考模型
為了實現各種網絡的互連,國際標準化組織(ISO)制定了開放式系統互連(OSI)參考模型。盡管OSI的體系結構從理論上講是比較完整的,但實際上,完全符合OSI各層協議的商用產品卻很少進入市場。而使用TCP/IP 協議的產品卻大量涌入市場,幾乎所有的工作站都配有TCP/IP協議,使得TCP/IP 成為計算機網絡的實際的國際標準。
2、套接字(socket)?
socket是操作系統的重要組成部分之一,它是網絡應用程序的基礎。從層次上來說,它位于應用層,是操作系統為應用程序員提供的API,通過它,應用程序可以訪問傳輸層協議。
1、socket 位于傳輸層協議之上,屏蔽了不同網絡協議之間的差異;
2、socket是網絡編程的入口,它提供了大量的系統調用,構成了網絡程序的主體;
3、在Linux系統中,socket屬于文件系統的一部分,網絡通信可以被看作是對文件的讀取,使得我們對網絡的控制和對文件的控制一樣方便。
2.1、套接字地址
在傳輸層上,通信端點可由Internet上3個參數描述:所用的協議、IP地址和端口號。這些內容由sockaddr描述:
typedef?unsigned?short????sa_family_t;
//通用socket地址
struct?sockaddr?{
????sa_family_t????sa_family;????/*?address?family,?AF_xxx,協議簇*/
????char????????sa_data[14];????/*?14?bytes?of?protocol?address????*/
};
//usr/include/netinet/in.h
//INET地址簇的socket地址
struct?in_addr?{
????????????????????__u32?s_addr;
};
struct?sockaddr_in???{
???sa_family_t????????????sin_family;??????/*?Address?family:?AF_INET?*/
???unsigned?short?int?????sin_port;????????/*?Port?number,端口*/
???struct?in_addr?????????sin_addr;????????/*?Internet?address,IP地址*/
???/*?Pad?to?size?of?'struct?sockaddr'?.?*/
???unsigned?char?sin_zero[sizeof?(struct?sockaddr)?-
??????????????????????????sizeof?(sa_family_t)?-
??????????????????????????sizeof?(uint16_t)?-
??????????????????????????sizeof?(struct?in_addr)];
};
Linux 支持的套接字地址族:
| 套接字地址族 | 描述 |
| UNIX | UNIX?域套接字 |
| INET | 通過?TCP/IP?協議支持的?Internet?地址族 |
| AX25 | Amater radio X25 |
| APPLETALK | Appletalk DDP |
| IPX | Novell IPX |
| X25 | X25 |
Linux 所支持的BSD套接字類型:
| ???????BSD?套接字類型 | ?描述 |
| 流(stream) | 這種套接字提供了可靠的雙向順序數據流,可保證數據不會在傳輸過程中丟失、破壞或重復出現。流套接字通過?INET?地址族的?TCP?協議實現。 |
| 數據報(datagram) | ?這種套接字也提供雙向的數據傳輸,但是并不對數據的傳輸提供擔保,也就是說,數據可能會以錯誤的順序傳遞,甚至丟失或破壞。這種類型的套接字通過?INET?地址族的UDP?協議實現。 |
| 原始(raw) | ?利用這種類型的套接字,進程可以直接訪問底層協議(因此稱為原始)。例如,可在某個以太網設備上打開原始套接字,然后獲取原始的?IP?數據傳輸信息。 |
| 可靠發送的消息 | ?和數據報套接字類似,但保證數據被正確傳輸到目的端。 |
| 順序數據包 | ?和流套接字類似,但數據包大小是固定的。 |
| 數據包(packet) | ?這并不是標準的?BSD?套接字類型,它是?Linux?專有的BSD?套接字擴展,可允許進程直接在設備級訪問數據包。 |
? 2.2、套接字操作
套接字(更確切的說是BSD套接字)為應用程序提供了基本的API,這些API是編寫網絡應用程序的基礎。
總結
以上是生活随笔為你收集整理的Linux网络协议栈(一)——Socket入门(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作为开发人员,这四类Code Revie
- 下一篇: linux下重新启动oracle