Socket编程(C语言实现)—— AF_INET(典型的TCP/IP四层模型的通信过程),AF_UNIX(本地进程间通信)
1、AF_INET域與Socket通信
? ? ?其是典型的TCP/IP四層模型的通信過程。
(1)接收方與發送方依賴IP和port來標識,即,將本地socket綁定到對應的IP端口上;
(2)發送數據時指定對方的IP與端口,經過Internet可以根據此端口最終找到接收方;
(3)接受數據時,可以從數據包內獲取到發送方的IP和端口號。
(1) 發送方通過系統調用send()將原始數據發送到操作系統內核緩沖區中。
(2) 內核緩沖區從上到下依次經過TCP層、IP層、鏈路層的編碼,分別添加對應的頭部信息,經過網卡將一個數據包發送到網絡中。
(3) 經過網絡路由到接收方的網卡。
(4) 網卡通過系統中斷將數據包通知到接收方的操作系統,再沿著發送方編碼的反方向進行解碼,即依次經過鏈路層、IP層、TCP層去除頭部、檢查校驗等;
(5)?最終將原始數據上報到接收方進程。
2、AF_UNIX域與Socket通信過程
? ?其是典型的IPC(本地進程間通信),依賴于路徑名標識接收方和發送方。
(1)發送數據時,指定接收方綁定的路徑名;
(2)操作系統可以直接根據該路徑名找到對應的接收方;
(3)并將數據直接拷貝到接受方的內核緩沖區內,并上報給接收方進程進行通信;
(4)接收方可以從收到的數據包中獲取到發送方的路徑名;
(5)并通過此路徑名向其發送數據。
3、進程間通信流式傳輸與報式傳輸
| ? | SOCK_STREAM(流式傳輸) | SOCK_DGRAM(報式傳輸) |
| AF_INET(TCP/IP通信) (明確知道對端地址) | 流式傳輸使用函數: send(),recv(); read(),write(); 流式傳輸類似于管道: | 報式傳輸使用函數: sendto(),redvfrom(); 報式傳輸區分邊界: 分包收取數據。 |
| AF_UNIX(本地進程間通信) (不知道對端地址) |
(1)AF_INET(TCP/IP通信協議),SOCKET_STREAM與SOCKET_DGRAM函數的使用方式:
Socket編程(C語言實現)——TCP協議(網絡間通信AF_INET)的流式(SOCK_STREAM)+報式(SOCK_DGRAM)傳輸【多線程+循環監聽】
(2)AF_UNIX(IPC本地進程間通信),SOCKET_STREAM與SOCKET_DGRAM函數的使用方式:
Socket編程(C語言實現)——UDP協議(進程間通信AF_UNIX)的流式(SOCK_STREAM)+報式(SOCK_DGRAM)傳輸【循環監聽】
(3)為什么說流式傳輸類似于管道,不區分邊界?
Socket編程(C語言實現)—— 為什么流式傳輸類似于管道?不區分邊界?
參考文章:https://blog.csdn.net/sandware/article/details/40923491?
總結
以上是生活随笔為你收集整理的Socket编程(C语言实现)—— AF_INET(典型的TCP/IP四层模型的通信过程),AF_UNIX(本地进程间通信)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Socket编程(C语言实现)—— 为什
- 下一篇: C语言——四字节对齐(4对齐后是4, 5