Title: ICE/STUN: Negotiation · Issue #2 · OpenXbox/xcloud-python · GitHub
Open Graph Title: ICE/STUN: Negotiation · Issue #2 · OpenXbox/xcloud-python
X Title: ICE/STUN: Negotiation · Issue #2 · OpenXbox/xcloud-python
Description: Problem ICE (Interactive Connectivity Establishment) / STUN is used to negotiate communication-channel between NAT'd hosts. Its currently only used for xhomestreaming. The initial ICE-message comes from the client (mobile device - iOS/An...
Open Graph Description: Problem ICE (Interactive Connectivity Establishment) / STUN is used to negotiate communication-channel between NAT'd hosts. Its currently only used for xhomestreaming. The initial ICE-message comes...
X Description: Problem ICE (Interactive Connectivity Establishment) / STUN is used to negotiate communication-channel between NAT'd hosts. Its currently only used for xhomestreaming. The initial ICE-message c...
Opengraph URL: https://github.com/OpenXbox/xcloud-python/issues/2
X: @github
Domain: patch-diff.githubusercontent.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"ICE/STUN: Negotiation","articleBody":"## Problem\r\nICE (Interactive Connectivity Establishment) / STUN is used to negotiate communication-channel between NAT'd hosts.\r\nIts currently only used for xhomestreaming.\r\nThe initial ICE-message comes from the client (mobile device - iOS/Android) to the cloud.\r\n\r\nQuestions:\r\n* Is Teredo involved for gathering that info?\r\n* Is it related to host mxhome.ipv6.microsoft.com ?\r\n* What are the 80 bytes long UDP packets, before STUN/ICE happens - is that maybe the communication with a STUN server to determine the Xbox's connectivity?\r\n\r\n## Current version of assembling the ICE request\r\nhttps://github.com/tuxuser/xcloud/blob/8295d2c86bf8ece56dbbd02c1f749a4426955bcb/ice.py#L26-L37\r\n\r\nYou can test what the used library produces when gathering local candidates with following snippet:\r\n\r\n```py\r\nimport asyncio\r\nfrom aiortc import RTCIceGatherer\r\n\r\n\r\nasync def main():\r\n gatherer = RTCIceGatherer()\r\n\r\n await gatherer.gather()\r\n candidates = gatherer.getLocalCandidates()\r\n params = gatherer.getLocalParameters()\r\n\r\n print(':: Candidates')\r\n for candidate in candidates:\r\n print(candidate)\r\n\r\n print(':: Params')\r\n print(params)\r\n\r\nasyncio.run(main())\r\n```\r\n\r\nLocal IPs: `10.0.0.102` (Wireless), `10.0.0.246` (Wired)\r\nPublic IP: `126.242.118.111`\r\n\r\nOutput:\r\n```text\r\n:: Candidates\r\nRTCIceCandidate(component=1, foundation='d175634b4f0f6f112c7c1cc9ad15ec68', ip='10.0.0.102', port=58503, priority=2130706431, protocol='udp', type='host', relatedAddress=None, relatedPort=None, sdpMid=None, sdpMLineIndex=None, tcpType=None)\r\nRTCIceCandidate(component=1, foundation='c03547823954444e207cb7cb72c3c97c', ip='10.0.0.246', port=55610, priority=2130706431, protocol='udp', type='host', relatedAddress=None, relatedPort=None, sdpMid=None, sdpMLineIndex=None, tcpType=None)\r\nRTCIceCandidate(component=1, foundation='b08d047b90595fc82469f8b2b3913eaf', ip='126.242.118.111', port=55610, priority=1694498815, protocol='udp', type='srflx', relatedAddress='10.0.0.246', relatedPort=55610, sdpMid=None, sdpMLineIndex=None, tcpType=None)\r\nRTCIceCandidate(component=1, foundation='7eb039734c8997056a4537b2821f17f2', ip='126.242.118.111', port=58503, priority=1694498815, protocol='udp', type='srflx', relatedAddress='10.0.0.102', relatedPort=58503, sdpMid=None, sdpMLineIndex=None, tcpType=None)\r\n:: Params\r\nRTCIceParameters(usernameFragment='Goil', password='LCeehS7T9xJ0uYOBtvJbXz', iceLite=False)\r\n```\r\n\r\n## Real / sample data\r\n\r\n**NOTE**: The actual JSON post data is in a very fucked format, so I converted it for better visibility.\r\n\r\nOriginal sample request, 1:1 as sent:\r\n\r\n```json\r\n{\r\n \"candidates\": \"{\\n \\\"Full\\\": \\\"1\\\",\\n \\\"PacingMs\\\": \\\"50\\\",\\n \\\"Version\\\": \\\"1\\\",\\n \\\"Candidates\\\": {\\n \\\"count\\\": \\\"2\\\",\\n \\\"0\\\": {\\n \\\"transportAddress\\\": \\\"10.0.0.187:46274\\\",\\n \\\"baseAddress\\\": \\\"10.0.0.187:46274\\\",\\n \\\"serverAddress\\\": \\\"\\\",\\n \\\"ipv6\\\": \\\"0\\\",\\n \\\"type\\\": \\\"0\\\",\\n \\\"addressType\\\": \\\"3\\\",\\n \\\"priority\\\": \\\"2130706175\\\",\\n \\\"foundation\\\": \\\"1047782621\\\",\\n \\\"transport\\\": \\\"udp\\\"\\n },\\n \\\"1\\\": {\\n \\\"transportAddress\\\": \\\"[2001:0:338c:24f4:3405:17fd:a21d:47d7]:59394\\\",\\n \\\"baseAddress\\\": \\\"teredo\\\",\\n \\\"serverAddress\\\": \\\"\\\",\\n \\\"ipv6\\\": \\\"1\\\",\\n \\\"type\\\": \\\"4\\\",\\n \\\"addressType\\\": \\\"0\\\",\\n \\\"priority\\\": \\\"2130706431\\\",\\n \\\"foundation\\\": \\\"1337598143\\\",\\n \\\"transport\\\": \\\"udp\\\"\\n }\\n },\\n \\\"Username\\\": \\\"F+R3n0qOTvc=\\\",\\n \\\"Password\\\": \\\"ciypiKgGwlnWDQ8nqx3oFy3xs6eRHo4WpVDoFNjWyiM=\\\"\\n}\\n\"\r\n}\r\n```\r\n\r\n### iOS\r\n\r\n#### Request\r\n\r\n```POST https://uks.gssv-play-prodxhome.xboxlive.com/v4/sessions/home/\u003cSESSION_GUID\u003e/ice```\r\n\r\n```json\r\n{\r\n \"candidates\": {\r\n \"Full\": \"1\",\r\n \"PacingMs\": \"50\",\r\n \"Version\": \"1\",\r\n \"Candidates\": {\r\n \"count\": \"7\",\r\n \"0\": {\r\n \"transportAddress\": \"[fe80::211:2daf:bbc4:7c6d]:59485\",\r\n \"baseAddress\": \"[fe80::211:2daf:bbc4:7c6d%utun1]:59485\",\r\n \"serverAddress\": \"\",\r\n \"ipv6\": \"1\",\r\n \"type\": \"0\",\r\n \"addressType\": \"4\",\r\n \"priority\": \"2130704895\",\r\n \"foundation\": \"1966258098\",\r\n \"transport\": \"udp\"\r\n },\r\n \"1\": {\r\n \"transportAddress\": \"[fe80::f7d9:41:3b02:e963]:54748\",\r\n \"baseAddress\": \"[fe80::f7d9:41:3b02:e963%utun0]:54748\",\r\n \"serverAddress\": \"\",\r\n \"ipv6\": \"1\",\r\n \"type\": \"0\",\r\n \"addressType\": \"4\",\r\n \"priority\": \"2130705151\",\r\n \"foundation\": \"1623794664\",\r\n \"transport\": \"udp\"\r\n },\r\n \"2\": {\r\n \"transportAddress\": \"[fe80::e8e2:a3ff:fe47:cf82]:57121\",\r\n \"baseAddress\": \"[fe80::e8e2:a3ff:fe47:cf82%awdl0]:57121\",\r\n \"serverAddress\": \"\",\r\n \"ipv6\": \"1\",\r\n \"type\": \"0\",\r\n \"addressType\": \"4\",\r\n \"priority\": \"2130705407\",\r\n \"foundation\": \"4238851165\",\r\n \"transport\": \"udp\"\r\n },\r\n \"3\": {\r\n \"transportAddress\": \"[fe80::e8e2:a3ff:fe47:cf82]:50840\",\r\n \"baseAddress\": \"[fe80::e8e2:a3ff:fe47:cf82%llw0]:50840\",\r\n \"serverAddress\": \"\",\r\n \"ipv6\": \"1\",\r\n \"type\": \"0\",\r\n \"addressType\": \"4\",\r\n \"priority\": \"2130705663\",\r\n \"foundation\": \"193038242\",\r\n \"transport\": \"udp\"\r\n },\r\n \"4\": {\r\n \"transportAddress\": \"10.0.0.210:64864\",\r\n \"baseAddress\": \"10.0.0.210:64864\",\r\n \"serverAddress\": \"\",\r\n \"ipv6\": \"0\",\r\n \"type\": \"0\",\r\n \"addressType\": \"3\",\r\n \"priority\": \"2130705919\",\r\n \"foundation\": \"8449565\",\r\n \"transport\": \"udp\"\r\n },\r\n \"5\": {\r\n \"transportAddress\": \"[fe80::1]:60576\",\r\n \"baseAddress\": \"[fe80::1%lo0]:60576\",\r\n \"serverAddress\": \"\",\r\n \"ipv6\": \"1\",\r\n \"type\": \"0\",\r\n \"addressType\": \"4\",\r\n \"priority\": \"2130706175\",\r\n \"foundation\": \"1535104454\",\r\n \"transport\": \"udp\"\r\n },\r\n \"6\": {\r\n \"transportAddress\": \"[2001:0:338c:24f4:429:211e:a21d:47d7]:57057\",\r\n \"baseAddress\": \"teredo\",\r\n \"serverAddress\": \"\",\r\n \"ipv6\": \"1\",\r\n \"type\": \"4\",\r\n \"addressType\": \"0\",\r\n \"priority\": \"2130706431\",\r\n \"foundation\": \"2234788496\",\r\n \"transport\": \"udp\"\r\n }\r\n },\r\n \"Username\": \"u1hWGHuvhTs=\",\r\n \"Password\": \"XFBjMQwX3CJxtHs1oj8WbzlT74I+P4gJWbh\\\\/OJrETgo=\"\r\n }\r\n}\r\n```\r\n\r\n#### Response\r\n\r\n```GET https://uks.gssv-play-prodxhome.xboxlive.com/v4/sessions/home/\u003cSESSION_GUID\u003e/ice```\r\n\r\n```json\r\n{\r\n \"candidates\": {\r\n \"Full\": \"1\",\r\n \"PacingMs\": \"50\",\r\n \"Version\": \"1\",\r\n \"Candidates\": {\r\n \"count\": \"3\",\r\n \"0\": {\r\n \"transportAddress\": \"10.0.0.174:51068\",\r\n \"baseAddress\": \"10.0.0.174:51068\",\r\n \"serverAddress\": \"\",\r\n \"ipv6\": \"0\",\r\n \"type\": \"0\",\r\n \"addressType\": \"3\",\r\n \"priority\": \"2130705919\",\r\n \"foundation\": \"3475377771\",\r\n \"transport\": \"udp\"\r\n },\r\n \"1\": {\r\n \"transportAddress\": \"[2001:0:338c:24f4:456:f3fd:a21d:47d7]:51069\",\r\n \"baseAddress\": \"[2001:0:338c:24f4:456:f3fd:a21d:47d7]:51069\",\r\n \"serverAddress\": \"\",\r\n \"ipv6\": \"1\",\r\n \"type\": \"0\",\r\n \"addressType\": \"0\",\r\n \"priority\": \"2130706175\",\r\n \"foundation\": \"1346576940\",\r\n \"transport\": \"udp\"\r\n },\r\n \"2\": {\r\n \"transportAddress\": \"[fe80::456:f3fd:a21d:47d7]:51070\",\r\n \"baseAddress\": \"[fe80::456:f3fd:a21d:47d7%6]:51070\",\r\n \"serverAddress\": \"\",\r\n \"ipv6\": \"1\",\r\n \"type\": \"0\",\r\n \"addressType\": \"4\",\r\n \"priority\": \"2130706431\",\r\n \"foundation\": \"2239954977\",\r\n \"transport\": \"udp\"\r\n }\r\n },\r\n \"Username\": \"K9rfTAAHfMI=\",\r\n \"Password\": \"g3IuMXEcLVau\\\\/2QhQq6MvpsOqGBJHJ3T3+tg68p97fs=\"\r\n }\r\n}\r\n```\r\n\r\n### Android\r\n\r\n#### Request\r\n\r\n```POST https://uks.gssv-play-prodxhome.xboxlive.com/v4/sessions/home/\u003cSESSION_GUID\u003e/ice```\r\n\r\n```json\r\n{\r\n \"candidates\": {\r\n \"Candidates\": {\r\n \"0\": {\r\n \"addressType\": \"3\",\r\n \"baseAddress\": \"10.0.0.187:46274\",\r\n \"foundation\": \"1047782621\",\r\n \"ipv6\": \"0\",\r\n \"priority\": \"2130706175\",\r\n \"serverAddress\": \"\",\r\n \"transport\": \"udp\",\r\n \"transportAddress\": \"10.0.0.187:46274\",\r\n \"type\": \"0\"\r\n },\r\n \"1\": {\r\n \"addressType\": \"0\",\r\n \"baseAddress\": \"teredo\",\r\n \"foundation\": \"1337598143\",\r\n \"ipv6\": \"1\",\r\n \"priority\": \"2130706431\",\r\n \"serverAddress\": \"\",\r\n \"transport\": \"udp\",\r\n \"transportAddress\": \"[2001:0:338c:24f4:3405:17fd:a21d:47d7]:59394\",\r\n \"type\": \"4\"\r\n },\r\n \"count\": \"2\"\r\n },\r\n \"Full\": \"1\",\r\n \"PacingMs\": \"50\",\r\n \"Password\": \"ciypiKgGwlnWDQ8nqx3oFy3xs6eRHo4WpVDoFNjWyiM=\",\r\n \"Username\": \"F+R3n0qOTvc=\",\r\n \"Version\": \"1\"\r\n }\r\n}\r\n```\r\n\r\n#### Response\r\n\r\n```GET https://uks.gssv-play-prodxhome.xboxlive.com/v4/sessions/home/\u003cSESSION_GUID\u003e/ice```\r\n\r\n```json\r\n{\r\n \"candidates\": {\r\n \"Candidates\": {\r\n \"0\": {\r\n \"addressType\": \"3\",\r\n \"baseAddress\": \"10.0.0.174:56974\",\r\n \"foundation\": \"1251832755\",\r\n \"ipv6\": \"0\",\r\n \"priority\": \"2130705919\",\r\n \"serverAddress\": \"\",\r\n \"transport\": \"udp\",\r\n \"transportAddress\": \"10.0.0.174:56974\",\r\n \"type\": \"0\"\r\n },\r\n \"1\": {\r\n \"addressType\": \"0\",\r\n \"baseAddress\": \"[2001:0:338c:24f4:20c1:f3fd:a21d:47d7]:56975\",\r\n \"foundation\": \"491644152\",\r\n \"ipv6\": \"1\",\r\n \"priority\": \"2130706175\",\r\n \"serverAddress\": \"\",\r\n \"transport\": \"udp\",\r\n \"transportAddress\": \"[2001:0:338c:24f4:20c1:f3fd:a21d:47d7]:56975\",\r\n \"type\": \"0\"\r\n },\r\n \"2\": {\r\n \"addressType\": \"4\",\r\n \"baseAddress\": \"[fe80::20c1:f3fd:a21d:47d7%6]:56976\",\r\n \"foundation\": \"3489845490\",\r\n \"ipv6\": \"1\",\r\n \"priority\": \"2130706431\",\r\n \"serverAddress\": \"\",\r\n \"transport\": \"udp\",\r\n \"transportAddress\": \"[fe80::20c1:f3fd:a21d:47d7]:56976\",\r\n \"type\": \"0\"\r\n },\r\n \"count\": \"3\"\r\n },\r\n \"Full\": \"1\",\r\n \"PacingMs\": \"50\",\r\n \"Password\": \"lNj2y+Q3Jkec7SlUcsOwaAHOS5Fad4gKxmmHBumPnTo=\",\r\n \"Username\": \"nxhPDLwFKc0=\",\r\n \"Version\": \"1\"\r\n }\r\n}\r\n```\r\n\r\n## Libraries\r\n\r\n[aiortc](https://github.com/aiortc/aiortc)\r\n[aioice (used by aiortc)](https://github.com/aiortc/aioice)\r\n\r\n## Specs\r\n\r\n[RFC 4380 Teredo: Tunneling IPv6 over UDP through Network Address Translations (NATs)](https://datatracker.ietf.org/doc/rfc4380/)\r\n[RFC 5245 Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal for Offer/Answer Protocols](https://tools.ietf.org/html/rfc5245)\r\n[RFC 5839 Session Traversal Utilities for NAT (STUN)](https://tools.ietf.org/html/rfc5389)\r\n[RFC 5991 Teredo Security Updates](https://datatracker.ietf.org/doc/rfc5991/)\r\n[RFC 6081 Teredo Extensions](https://datatracker.ietf.org/doc/rfc6081/)\r\n[RFC 8445 Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal](https://tools.ietf.org/html/rfc8445)","author":{"url":"https://github.com/tuxuser","@type":"Person","name":"tuxuser"},"datePublished":"2020-09-29T22:10:56.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2},"url":"https://github.com/2/xcloud-python/issues/2"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:8579ae37-ec9d-dd83-acac-a26452aff3b5 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | ECC0:11245:63AD63:84B3F7:698D8009 |
| html-safe-nonce | e9d82bad81f473747320ae692ae1409ea00cdc52f313b0a5c1b9a38c2bead21d |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFQ0MwOjExMjQ1OjYzQUQ2Mzo4NEIzRjc6Njk4RDgwMDkiLCJ2aXNpdG9yX2lkIjoiMjgzMjA0MTU4MDg0NzEwNDA5IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | 8a8143b5e1722293375889d9cef4e07d35dd5fdfc60294a9dcbd5326b69ca4cf |
| hovercard-subject-tag | issue:711493015 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/OpenXbox/xcloud-python/2/issue_layout |
| twitter:image | https://opengraph.githubassets.com/c0866d5136c9b09ee8c4c9d34c3f4e705481ec5903640e16f00ceeaf67a62fe6/OpenXbox/xcloud-python/issues/2 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/c0866d5136c9b09ee8c4c9d34c3f4e705481ec5903640e16f00ceeaf67a62fe6/OpenXbox/xcloud-python/issues/2 |
| og:image:alt | Problem ICE (Interactive Connectivity Establishment) / STUN is used to negotiate communication-channel between NAT'd hosts. Its currently only used for xhomestreaming. The initial ICE-message comes... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | tuxuser |
| hostname | github.com |
| expected-hostname | github.com |
| None | c0818105fa276287e9369cfdefa0a0fa7953719791ceff9b94d69623c0a4fe8a |
| turbo-cache-control | no-preview |
| go-import | github.com/OpenXbox/xcloud-python git https://github.com/OpenXbox/xcloud-python.git |
| octolytics-dimension-user_id | 31669505 |
| octolytics-dimension-user_login | OpenXbox |
| octolytics-dimension-repository_id | 268237406 |
| octolytics-dimension-repository_nwo | OpenXbox/xcloud-python |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 268237406 |
| octolytics-dimension-repository_network_root_nwo | OpenXbox/xcloud-python |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 715890fa442134f528fb422ab338c0ad55c7a025 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width