net_detection.h 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #pragma once
  2. #include <string>
  3. enum NatBehavior
  4. {
  5. UnknownBehavior,
  6. DirectMapping, // IP address and port are the same between client and server view (NO NAT)
  7. EndpointIndependentMapping, // same mapping regardless of IP:port original packet sent to (the kind of NAT we like)
  8. AddressDependentMapping, // mapping changes for local socket based on remote IP address only, but remote port can change (partially symmetric, not great)
  9. AddressAndPortDependentMapping // different port mapping if the ip address or port change (symmetric NAT, difficult to predict port mappings)
  10. };
  11. enum NatFiltering
  12. {
  13. UnknownFiltering,
  14. DirectConnectionFiltering,
  15. EndpointIndependentFiltering, // shouldn't be common unless connection is already direct (can receive on mapped address from anywhere regardless of where the original send went)
  16. AddressDependentFiltering, // IP-restricted NAT
  17. AddressAndPortDependentFiltering // port-restricted NAT
  18. };
  19. enum NAT_TYPE
  20. {
  21. NAT_UnknownType,
  22. NAT_DirectMapping,
  23. NAT_FullCone,
  24. NAT_IpRestricted,
  25. NAT_PortRestricted,
  26. NAT_Symmetric
  27. };
  28. //先检测behavior,再检测filtering,结合2者判断
  29. /*
  30. 1、NAT_BEHAVIOR_UnknownBehavior 不用继续测
  31. 2、AT_BEHAVIOR_DirectMapping 直连,没有nat,不用继续测
  32. 3、NAT_BEHAVIOR_EndpointIndependentMapping
  33. 1)NAT_Filtering_UnknownFiltering 未定义
  34. 2)NAT_Filtering_DirectConnectionFiltering, 没有过滤,认为全锥形
  35. 3)NAT_Filtering_EndpointIndependentFiltering, 端口无关过滤,对应全锥形
  36. 4)NAT_Filtering_AddressDependentFiltering, 地址依赖过滤,认为是地址受限锥形
  37. 5)NAT_Filtering_AddressAndPortDependentFiltering 地址和端口依赖过滤,认为是 地址端口受限锥形
  38. 4、 NAT_BEHAVIOR_AddressDependentMapping
  39. 和3一样
  40. 5、NAT_BEHAVIOR_AddressAndPortDependentMapping 认为是对称型
  41. */
  42. namespace ServiceNatDetection
  43. {
  44. NatBehavior get_nat_behavior(std::string& nat_ip, const std::string& stun_server, uint16_t stun_port);
  45. NatFiltering get_nat_filtering(std::string& nat_ip, const std::string& stun_server, uint16_t stun_port);
  46. NAT_TYPE get_nat_type(NatBehavior natBehavior, NatFiltering natFiltering);
  47. };