试验UDP打洞穿透NAT

2023-12-08 03:59
文章标签 udp nat 穿透 试验 打洞

本文主要是介绍试验UDP打洞穿透NAT,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目标

路由穿透,实现广域网P2P通讯。

4种典型NAT类型

按照NAT设备在进行地址映射时行为的不同,NAT可以分为以下四种: 

  1. Full Cone 

  2. Restricted Cone 

  3. Port Restricted Cone 

  4. Symmentric 

如何判断本机NAT类型

可以通过PyStun来判断:

  1. NAT Type: Full Cone
  2. External IP: 180.160.213.93
  3. External Port: 32130

几种现代穿透协议

STUN

STUN协议为终端提供一种方式能够获知自己经过NAT映射后的地址,从而替代位于应用层中的私网地址,达到NAT穿透的目的。STUN协议是典型的Client-Server协议,各种具体应用通过嵌入STUN客户端与STUN Server端通讯来完成交互。 

在典型的运用STUNNAT穿透场景中,STUN客户端首先向位于公网上的STUN器 发送Binding RequestSTUN器接收到请求消息后识别出经过NAT转换后的公网地址60.1.1.1:12345,将其加在Binding Response中返回给客户端。客户端得到这个地址 后用它替换SDP中的私地址与终端B完成媒体协商。使用STUN进行NAT穿透对应用的要 求是必须使用同样的端口与STUN务器交互和进行应用层通讯,比如当希望使用端口 37000进行RTP包的NAT穿透时,必须同样使用37000端口与STUN服务器通讯,否则从STUN服务器获得的NAT后的地址一般与实际地址时不一样的。另一个要求是STUN客户端与 服务器端的通讯和应用使用获得的NAT映射地址进行应用层通讯在时间上必须有连贯性, 这源于NAT设备建立的绑定有生存时间,当原绑定消亡后,NAT为同一个私网地址建 立的新绑定往往不同,因此转换后的公网地址是不同的。

 

STUN方案特性如下表:

 

特性

说明

实现复杂度

实现简单

TCP穿透支持

不支持

对现有设备的要求

要求客户端支持对现有NAT无改动要求需增加STUN服务器

可扩展性

可扩展性好,与具体协议无关

安全性

一般

健壮性

差,不支持symmentricNAT

其他

支持自动检测NAT,使用户即使在使用STUN协议无实现NAT

穿透时还可以根据NAT类型自主选择其他可使用的NAT穿透方案

 

TURN

TURN解决NAT穿透的思路与STUN类似,都是通过修改应用层中的私网地址达到NAT穿透。 与STUN不同的是,TURN是通过两方通讯的“中间人”的方式实现穿透,在这种方式下, 要进行通讯的两方分别与位于公网上的TURN服务器建立各自的连接进行通讯,由服务器负 责在两方之间进行数据转发。要达到这个目的,实现TURN客户端的终端必须在通讯开始前 与TURN服务器进行交互,得到服务器为其临时分配的位于TURN服务器上的公网地址,客户端使用它替换位于应用层中的私网地址。

TURN方案的特性如下表:

 

特性

说明

实现复杂度

难于实现。TURN的安全性设计增加终端设置的复杂度

TCP穿透支持

支持

对现有设备的要求

对现有NAT设备无要求,要求客户端支持,需增加TURN服务器s

可扩展性

可扩展性好,与具体协议无关

安全性

一般

健壮性

好,支持所有类型的NAT

其他

P2P穿透方式相比,性能时relay穿透方式的弱点。另外TURN无法

实现负载分担,解决的方式是media relay服务器的分配工作放在 SIP proxy完成

ICE

与STUN和TURN相比,ICE并非是解决NAT穿透问题的协议,而是一个框架,在这个框架中, 可以整合其他现存的NAT穿透协议,如STUN、TURN、RSIP等。区别于其他的NAT穿透解 决方案,ICE是一种探索和更新式的解决方案,通过搜集自身和对端尽可能多的网络信息(各种网络地址),尝试在这些地址间建立数据通道,并在这一过程中不断更新先前收集到的信息,从而找出和选择能够进行NAT穿透的数据通道。

ICE方案的特性如下表:

特性

说明

实现复杂度

一般

TCP穿透支持

支持

对现有设备的要求

NAT无要求,支持所有类型的NAT。客户端必须支持,

网路结构中需增加STUN/TURN服务器

可扩展性

可扩展性好,与具体协议无关

安全性

较好

健壮性

好,适用与所有NAT及NAT拓扑类型,且由于存在中继服务器,NAT

穿透一般总是能成功

其他

 

试验环境

两台PC——

A位于公网IP为180.160.213.93 的路由下,内网IP为192.168.1.100,通过端口8888通讯。

B位于公网IP为180.160.233.193的路由下,内网IP为192.168.1.107,通过端口6666通讯。

大致如图所示:

 

 

STUN服务器采用免费的公用STUN服务器,具体STUN服务器列表在此。

试验过程

基于开源的Java ICE库ice4j,编写客户端,其中,客户端调用代码:

  1. package com.hankcs.network;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.net.DatagramPacket;
  7. import java.net.DatagramSocket;
  8. import java.net.SocketAddress;
  9.  
  10.  
  11. public class Peer
  12. {
  13.     public static void main(String[] args) throws Throwable
  14.     {
  15.         try
  16.         {
  17.             IceClient client = new IceClient(8888, "text");
  18.             client.init();
  19.             client.exchangeSdpWithPeer();
  20.             client.startConnect();
  21.             final DatagramSocket socket = client.getDatagramSocket();
  22.             final SocketAddress remoteAddress = client
  23.                     .getRemotePeerSocketAddress();
  24.             System.out.println(socket.toString());
  25.             new Thread(new Runnable()
  26.             {
  27.  
  28.                 public void run()
  29.                 {
  30.                     while (true)
  31.                     {
  32.                         try
  33.                         {
  34.                             byte[] buf = new byte[1024];
  35.                             DatagramPacket packet = new DatagramPacket(buf,
  36.                                                                        buf.length);
  37.                             socket.receive(packet);
  38.                             System.out.println(packet.getAddress() + ":" + packet.getPort() + " says: " + new String(packet.getData(), 0, packet.getLength()));
  39.                         }
  40.                         catch (IOException e)
  41.                         {
  42.                             e.printStackTrace();
  43.                         }
  44.                     }
  45.                 }
  46.             }).start();
  47.  
  48.             new Thread(new Runnable()
  49.             {
  50.  
  51.                 public void run()
  52.                 {
  53.                     try
  54.                     {
  55.                         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  56.                         String line;
  57.                         // 从键盘读取
  58.                         while ((line = reader.readLine()) != null)
  59.                         {
  60.                             line = line.trim();
  61.                             if (line.length() == 0)
  62.                             {
  63.                                 break;
  64.                             }
  65.                             byte[] buf = (line).getBytes();
  66.                             DatagramPacket packet = new DatagramPacket(buf, buf.length);
  67.                             packet.setSocketAddress(remoteAddress);
  68.                             socket.send(packet);
  69.                         }
  70.                     }
  71.                     catch (Exception e)
  72.                     {
  73.                         e.printStackTrace();
  74.                     }
  75.  
  76.                 }
  77.             }).start();
  78.         }
  79.         catch (Exception e)
  80.         {
  81.             e.printStackTrace();
  82.         }
  83.  
  84.     }
  85.  
  86. }

为了简便,没有引入SIP服务器,直接用人工复制粘贴的方式交换了两台设备的SDP信息,其中

A的SDP信息:

  1. v=0
  2. o=ice4j.org 0 0 IN IP4 66.228.45.110
  3. s=-
  4. t=0 0
  5. a=ice-options:trickle
  6. a=ice-ufrag:26iqs1932ucrkp
  7. a=ice-pwd:7rnncil3dqga9q5fl5e3jppobk
  8. m=text 50659 RTP/AVP 0
  9. c=IN 66.228.45.110 IP4
  10. a=mid:text
  11. a=candidate:1 1 udp 2130706431 192.168.1.100 8888 typ host
  12. a=candidate:2 1 udp 2130706431 fe80:0:0:0:38f0:a54b:a8a6:e8b6 8888 typ host
  13. a=candidate:3 1 udp 1677724415 180.160.213.93 25627 typ srflx raddr 192.168.1.100 rport 8888
  14. a=candidate:4 1 udp 2815 66.228.45.110 50659 typ relay raddr 180.160.213.93 rport 25627

B的SDP信息:

  1. v=0
  2. o=ice4j.org 0 0 IN IP4 66.228.45.110
  3. s=-
  4. t=0 0
  5. a=ice-options:trickle
  6. a=ice-ufrag:dpmfo1912ud8p2
  7. a=ice-pwd:2q4c0689j98st3jmbr5k4jgc9k
  8. m=text 50656 RTP/AVP 0
  9. c=IN 66.228.45.110 IP4
  10. a=mid:text
  11. a=candidate:1 1 udp 2130706431 192.168.1.107 6666 typ host
  12. a=candidate:2 1 udp 2130706431 fe80:0:0:0:448b:e2e1:7f4b:f0b8 6666 typ host
  13. a=candidate:3 1 udp 1677724415 180.160.233.193 44639 typ srflx raddr 192.168.1.107 rport 6666
  14. a=candidate:4 1 udp 2815 66.228.45.110 50656 typ relay raddr 180.160.233.193 rport 44639

交换信息后A的配对过程输出:

  1. 九月 30, 2014 5:32:53 下午 org.ice4j.ice.Component addRemoteCandidate
  2. 信息: Add remote candidate for text.RTP: 192.168.1.107:6666/udp/host
  3. 九月 30, 2014 5:32:53 下午 org.ice4j.ice.Component addRemoteCandidate
  4. 信息: Add remote candidate for text.RTP: [fe80:0:0:0:448b:e2e8:7f8b:f0b8]:6666/udp/host
  5. 九月 30, 2014 5:32:53 下午 org.ice4j.ice.Component addRemoteCandidate
  6. 信息: Add remote candidate for text.RTP: 180.160.233.193:44639/udp/srflx
  7. 九月 30, 2014 5:32:53 下午 org.ice4j.ice.Component addRemoteCandidate
  8. 信息: Add remote candidate for text.RTP: 66.228.45.110:50656/udp/relay
  9. 九月 30, 2014 5:32:55 下午 org.ice4j.ice.Agent startConnectivityEstablishment
  10. 信息: Start ICE connectivity establishment
  11. 九月 30, 2014 5:32:55 下午 org.ice4j.ice.Agent initCheckLists
  12. 信息: Init checklist for stream text
  13. 九月 30, 2014 5:32:55 下午 org.ice4j.ice.ConnectivityCheckClient startChecks
  14. 信息: Start connectivity checks!
  15. 17:32:55.651 [main] INFO  com.hankcs.network.IceClient - Agent entered the Running state.
  16. 九月 30, 2014 5:33:06 下午 org.ice4j.ice.ConnectivityCheckClient processTimeout
  17. 信息: timeout for pair: 192.168.1.100:8888/udp/host -> 192.168.1.107:6666/udp/host (text.RTP), failing.
  18. 九月 30, 2014 5:33:16 下午 org.ice4j.ice.ConnectivityCheckClient processTimeout
  19. 信息: timeout for pair: [fe80:0:0:0:38f0:a54b:a8a6:e8b6]:8888/udp/host -> [fe80:0:0:0:448b:e2e8:7f8b:f0b8]:6666/udp/host (text.RTP), failing.
  20. 九月 30, 2014 5:33:26 下午 org.ice4j.ice.ConnectivityCheckClient processTimeout
  21. 信息: timeout for pair: 192.168.1.100:8888/udp/host -> 180.160.233.193:44639/udp/srflx (text.RTP), failing.
  22. 九月 30, 2014 5:33:36 下午 org.ice4j.ice.ConnectivityCheckClient processTimeout
  23. 信息: timeout for pair: 66.228.45.110:50659/udp/relay -> 192.168.1.107:6666/udp/host (text.RTP), failing.
  24. 九月 30, 2014 5:33:36 下午 org.ice4j.ice.Agent incomingCheckReceived
  25. 信息: Received check from 192.168.1.100:8888/udp/host -> 180.160.233.193:44724/udp/prflx (text.RTP) triggered a check
  26. 九月 30, 2014 5:33:36 下午 org.ice4j.ice.Agent triggerCheck
  27. 信息: Add peer CandidatePair with new reflexive address to checkList
  28. 九月 30, 2014 5:33:45 下午 org.ice4j.ice.ConnectivityCheckClient processSuccessResponse
  29. 信息: Pair succeeded: 192.168.1.100:8888/udp/host -> 180.160.233.193:44724/udp/prflx (text.RTP)
  30. 九月 30, 2014 5:33:45 下午 org.ice4j.ice.ConnectivityCheckClient processSuccessResponse
  31. 信息: Pair validated: 180.160.213.93:25627/udp/srflx -> 180.160.233.193:44724/udp/prflx (text.RTP)
  32. 九月 30, 2014 5:33:45 下午 org.ice4j.ice.ConnectivityCheckClient processSuccessResponse
  33. 信息: IsControlling: false USE-CANDIDATE:false
  34. 九月 30, 2014 5:33:45 下午 org.ice4j.ice.ConnectivityCheckClient processSuccessResponse
  35. 信息: Nomination confirmed for pair: 180.160.213.93:25627/udp/srflx -> 180.160.233.193:44724/udp/prflx (text.RTP)
  36. 17:33:45.695 [Stun4J Message Processor] INFO  com.hankcs.network.IceClient - Agent entered the Completed state.
  37. 17:33:45.695 [Stun4J Message Processor] INFO  com.hankcs.network.IceClient - Total ICE processing time: 139649ms
  38. 17:33:45.695 [Stun4J Message Processor] INFO  com.hankcs.network.IceClient - Stream name: text
  39. 17:33:45.695 [Stun4J Message Processor] INFO  com.hankcs.network.IceClient - ------------------------------------------
  40. 17:33:45.695 [Stun4J Message Processor] INFO  com.hankcs.network.IceClient - Component of stream:RTP,selected of pair:CandidatePair (State=Succeeded Priority=7926347438766424062):
  41. LocalCandidate=candidate:1 1 udp 2130706431 192.168.1.100 8888 typ host
  42. RemoteCandidate=candidate:10000 1 udp 1845496575 180.160.233.193 44724 typ prflx
  43. 17:33:45.695 [Stun4J Message Processor] INFO  com.hankcs.network.IceClient - ------------------------------------------
  44. 17:33:45.695 [Stun4J Message Processor] INFO  com.hankcs.network.IceClient - Printing the completed check lists:
  45. 17:33:45.696 [Stun4J Message Processor] INFO  com.hankcs.network.IceClient - Check list for  stream: text
  46. 17:33:45.696 [Stun4J Message Processor] INFO  com.hankcs.network.IceClient - nominated check list:CheckList. (num pairs=5)
  47. CandidatePair (State=Failed Priority=9151314442783293438):
  48. LocalCandidate=candidate:1 1 udp 2130706431 192.168.1.100 8888 typ host
  49. RemoteCandidate=candidate:1 1 udp 2130706431 192.168.1.107 6666 typ host
  50. CandidatePair (State=Failed Priority=9151314442783293438):
  51. LocalCandidate=candidate:2 1 udp 2130706431 fe80:0:0:0:38f0:a54b:a8a6:e8b6 8888 typ host
  52. RemoteCandidate=candidate:2 1 udp 2130706431 fe80:0:0:0:448b:e2e8:7f8b:f0b8 6666 typ host
  53. CandidatePair (State=Failed Priority=7205771498387144702):
  54. LocalCandidate=candidate:1 1 udp 2130706431 192.168.1.100 8888 typ host
  55. RemoteCandidate=candidate:3 1 udp 1677724415 180.160.233.193 44639 typ srflx raddr 192.168.1.107 rport 6666
  56. CandidatePair (State=Failed Priority=12094594351103):
  57. LocalCandidate=candidate:4 1 udp 2815 66.228.45.110 50659 typ relay raddr 180.160.213.93 rport 25627
  58. RemoteCandidate=candidate:1 1 udp 2130706431 192.168.1.107 6666 typ host
  59. CandidatePair (State=Succeeded Priority=7926347438766424062):
  60. LocalCandidate=candidate:1 1 udp 2130706431 192.168.1.100 8888 typ host
  61. RemoteCandidate=candidate:10000 1 udp 1845496575 180.160.233.193 44724 typ prflx
  62.  
  63. 九月 30, 2014 5:33:45 下午 org.ice4j.ice.CheckList handleNominationConfirmed
  64. 信息: Selected pair for stream text.RTP: 192.168.1.100:8888/udp/host -> 180.160.233.193:44724/udp/prflx (text.RTP)
  65. 九月 30, 2014 5:33:45 下午 org.ice4j.ice.Agent checkListStatesUpdated
  66. 信息: CheckList of stream text is COMPLETED
  67. 九月 30, 2014 5:33:45 下午 org.ice4j.ice.Agent checkListStatesUpdated
  68. 信息: ICE state is COMPLETED
  69. 17:33:45.696 [main] INFO  com.hankcs.network.IceClient - Component id=1 parent stream=text
  70. 4 Local candidates:
  71. default candidate: candidate:4 1 udp 2815 66.228.45.110 50659 typ relay raddr 180.160.213.93 rport 25627
  72. candidate:1 1 udp 2130706431 192.168.1.100 8888 typ host
  73. candidate:2 1 udp 2130706431 fe80:0:0:0:38f0:a54b:a8a6:e8b6 8888 typ host
  74. candidate:3 1 udp 1677724415 180.160.213.93 25627 typ srflx raddr 192.168.1.100 rport 8888
  75. candidate:4 1 udp 2815 66.228.45.110 50659 typ relay raddr 180.160.213.93 rport 25627
  76. 4 Remote candidates:
  77. default remote candidate: null
  78. candidate:1 1 udp 2130706431 192.168.1.107 6666 typ host
  79. candidate:2 1 udp 2130706431 fe80:0:0:0:448b:e2e8:7f8b:f0b8 6666 typ host
  80. candidate:3 1 udp 1677724415 180.160.233.193 44639 typ srflx raddr 192.168.1.107 rport 6666
  81. candidate:4 1 udp 2815 66.228.45.110 50656 typ relay raddr 180.160.233.193 rport 44639
  82. 17:33:45.697 [main] INFO  com.hankcs.network.IceClient - candidate:1 1 udp 2130706431 192.168.1.100 8888 typ host
  83. 17:33:45.697 [main] INFO  com.hankcs.network.IceClient - Remote candinate transport address:180.160.233.193:44724/udp
  84. 17:33:45.697 [main] INFO  com.hankcs.network.IceClient - Remote candinate host address:null
  85. 17:33:45.697 [main] INFO  com.hankcs.network.IceClient - Remote candinate mapped address:null
  86. 17:33:45.697 [main] INFO  com.hankcs.network.IceClient - Remote candinate relayed address:null
  87. 17:33:45.697 [main] INFO  com.hankcs.network.IceClient - Remote candinate reflexive address:180.160.233.193:44724/udp
  88. org.ice4j.socket.MultiplexingDatagramSocket@46160dbd
  89. 九月 30, 2014 5:33:45 下午 org.ice4j.ice.Agent logCandTypes
  90. 信息: Harvester used for selected pair for text.RTP: host
  91. 17:33:48.700 [TerminationThread] INFO  com.hankcs.network.IceClient - Agent entered the Terminated state.
  92. 17:33:48.700 [TerminationThread] INFO  com.hankcs.network.IceClient - ice processing TERMINATED
  93. 九月 30, 2014 5:33:48 下午 org.ice4j.ice.Agent$TerminationThread run
  94. 信息: ICE state is TERMINATED

其中,值得注意的是两台设备通过地址对

  1. Nomination confirmed for pair: 180.160.213.93:25627/udp/srflx -> 180.160.233.193:44724/udp/prflx (text.RTP)

建立了UDP连接。

试验结果

之后B通过键盘输入聊天消息并发送

  1. hello
  2. /180.160.213.93:25627 says: AS
  3. yes
  4. haha
  5. /180.160.213.93:25627 says: ZA

A收到消息并回复

  1. /180.160.233.193:44724 says: hello
  2. AS
  3. /180.160.233.193:44724 says: yes
  4. /180.160.233.193:44724 says: haha
  5. ZA

一些尝试

将B通过手机热点接入中国电信3G网络后,NAT穿透失败,原因不明。可能此时B属于Symmentric NAT,同时免费的TURN服务器也没有起作用。接下来应当深入研究这几种协议,以及TURN服务器的搭建。

Reference

《NAT穿透解决方案》

http://www.cnblogs.com/javaminer/p/3575282.html

这篇关于试验UDP打洞穿透NAT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/468457

相关文章

网络学习-eNSP配置NAT

NAT实现内网和外网互通 #给路由器接口设置IP地址模拟实验环境<Huawei>system-viewEnter system view, return user view with Ctrl+Z.[Huawei]undo info-center enableInfo: Information center is disabled.[Huawei]interface gigabit

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

防止缓存击穿、缓存穿透和缓存雪崩

使用Redis缓存防止缓存击穿、缓存穿透和缓存雪崩 在高并发系统中,缓存击穿、缓存穿透和缓存雪崩是三种常见的缓存问题。本文将介绍如何使用Redis、分布式锁和布隆过滤器有效解决这些问题,并且会通过Java代码详细说明实现的思路和原因。 1. 背景 缓存穿透:指的是大量请求缓存中不存在且数据库中也不存在的数据,导致大量请求直接打到数据库上,形成数据库压力。 缓存击穿:指的是某个热点数据在

综合DHCP、ACL、NAT、Telnet和PPPoE进行网络设计练习

描述:企业内网和运营商网络如上图所示。 公网IP段:12.1.1.0/24。 内网IP段:192.168.1.0/24。 公网口PPPOE 拨号采用CHAP认证,用户名:admin 密码:Admin@123 财务PC 配置静态IP:192.168.1.8 R1使用模拟器中的AR201型号,作为交换路由一体机,下图的WAN口为E0/0/8口,可以在该接口下配置IP地址。 可以通过

VC环境下window网络程序:UDP Socket程序

最近在学Windows网络编程,正好在做UDPsocket的程序,贴上来: 服务器框架函数:              socket();    bind();    recfrom();  sendto();  closesocket(); 客户机框架函数:            socket();      recfrom();  sendto();  closesocket();

9.7(UDP局域网多客户端聊天室)

服务器端 #include<myhead.h>#define SERIP "192.168.0.132"#define SERPORT 8888#define MAX 50//定义用户结构体typedef struct{struct sockaddr_in addr;int flag;}User;User users[MAX];//用户列表void add_user(struct s

使用lanproxy进行内网穿透

https://github.com/ffay/lanproxy https://www.jianshu.com/p/6482ac354d34

redis缓存预热、缓存穿透的详细教程

前言     作此篇主要在于关于redis的缓存预热、缓存雪崩、缓存击穿和缓存穿透在面试中经常遇到,工作中也是经常遇到。中级程序员基本上不可避免要克服的几个问题,希望一次性解释清楚 缓存预热 MySQL加入新增100条记录,一般默认以MySQL为准为底单数据,如何同步给redis(布隆过滤器) 这是100合法数据,mysql有100条新纪录,但是redis无。     为什么需要预热

经验笔记:NAT穿越技术

NAT穿越技术经验笔记 随着互联网的普及和技术的发展,P2P(Peer to Peer,点对点)通信成为许多应用的核心功能之一。然而,网络地址转换(NAT)设备的存在常常成为实现P2P通信的一个障碍。本文旨在总结NAT穿越技术的基本原理及其配置方法,并探讨如何保障NAT穿越的安全性。 1. NAT穿越技术概述 NAT穿越技术是一种使位于不同NAT网络中的主机能够直接通信的技术。NAT(Net

应用层简单实现udp / tcp网络通信

一、常见网络接口总结 1、创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器) int socket(int domain, int type, int protocol); domain:AF_INET:网络通信,AF_LOCAL:本地通信 type:UDP:SOCK_DGRAM,TCP:SOCK_STREAM protocol:协议编号一开始设0 返回值:文件描