RFC 7753

Port Control Protocol (PCP) Extension for Port-Set Allocation

πŸ“… published February 2016, from ietf

RFC 7753: Port Control Protocol (PCP) Extension for Port-Set Allocation πŸ’–

Series: Internet Engineering Task Force (IETF) 🌸 Category: Standards Track πŸ“œ ISSN: 2070-1721 ✨ Date: February 2016 πŸ¦‹

Authors: Q. Sun (China Telecom), M. Boucadair (France Telecom), S. Sivakumar (Cisco Systems), C. Zhou (Huawei Technologies), T. Tsou (Philips Lighting), and S. Perreault (Jive Communications) 🫢

Abstract ✨

Okay so, in some use cases (like Lightweight 4over6), a client might need not just one port but a whole port set πŸŽ€. This document defines an extension to the Port Control Protocol (PCP) that lets clients manipulate a set of ports as one whole unit πŸ’…. It's done with a brand new MAP option called PORT_SET πŸ”₯.

Status of This Memo

Bestie, this one is an Internet Standards Track document πŸ“œ.

It's a product of the Internet Engineering Task Force (IETF), so it represents the consensus of the IETF community 🫢. It got public review and was approved for publication by the Internet Engineering Steering Group (IESG) ✨. If you want more info on Internet Standards, check Section 2 of RFC 5741 πŸ¦‹.

For the current status of this document, any errata, and how to send feedback, go to http://www.rfc-editor.org/info/rfc7753 🌈.

Copyright (c) 2016 IETF Trust and the persons identified as the document authors. All rights reserved. πŸ’œ

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please read these carefully, because they describe your rights and restrictions regarding this document πŸ™ˆ. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions, and they are provided without warranty as described in the Simplified BSD License πŸ’€.

Table of Contents 🧚

   1. Introduction ....................................................4
      1.1. Applications Using Port Sets ...............................4
      1.2. Lightweight 4over6 .........................................4
      1.3. Firewall Control ...........................................4
      1.4. Discovering Stateless Port-Set Mappings ....................5
   2. The Need for PORT_SET ...........................................5
   3. Terminology .....................................................6
   4. The PORT_SET Option .............................................6
      4.1. Client Behavior ............................................8
      4.2. Server Behavior ............................................8
      4.3. Absence of Capability Discovery ............................9
      4.4. Port-Set Renewal and Deletion .............................10
           4.4.1. Overlap Conditions .................................10
   5. Examples .......................................................10
      5.1. Simple Request on Network Address Translator
           IPv4/IPv4 (NAT44) .........................................10
      5.2. Stateless Mapping Discovery ...............................12
      5.3. Resolving Overlap .........................................13
   6. Operational Considerations .....................................13
      6.1. Limits and Quotas .........................................13
      6.2. High Availability .........................................13
      6.3. Idempotence ...............................................13
      6.4. What should a PCP client do when it receives fewer
           ports than requested? .....................................15
   7. Security Considerations ........................................15
   8. IANA Considerations ............................................16
   9. References .....................................................16
      9.1. Normative References ......................................16
      9.2. Informative References ....................................16
   Acknowledgements ..................................................17
   Contributors ......................................................17
   Authors' Addresses ................................................18

1. Introduction ✨

Okay, this document extends the Port Control Protocol (PCP) [RFC6887] so you can grab a whole set of ports with a single request πŸŽ€. It does this by defining a new PORT_SET option πŸ’….

This section walks through a few of the use cases the authors had in mind. Just so you know, the PCP extension in this document is generic, and it's expected to work for other use cases too 🌈.

1.1. Applications Using Port Sets

Some applications need not just one port but a port set πŸ¦‹. One example is a Session Initiation Protocol (SIP) User Agent Server (UAS) [RFC3261] that's expecting to handle multiple concurrent calls, including media termination πŸ“ž. When the UAS gets a call, it has to signal media port numbers to its peer. If it sent individual PCP MAP requests for each media port during call setup, that would add unwanted latency and extra signaling load 😭. Instead, the server can pre-allocate a set of ports, so no PCP exchange is needed during call setup 🧚.

1.2. Lightweight 4over6

In the Lightweight 4over6 (lw4o6) [RFC7596] architecture, shared global addresses can be allocated to customers 🌸. This lets the Network Address Translation (NAT) function move away from the Carrier-Grade NAT (CGN) [RFC6888] and over to the Customer Premises Equipment (CPE) 🏠. The result is more control over NAT for the user, and more scalability for the Internet Service Provider (ISP) πŸ‘‘.

In the lw4o6 architecture, the PCP-controlled device is the Lightweight Address Family Transition Router (lwAFTR), and the PCP client is the Lightweight B4 (lwB4) πŸ’œ. The PCP client sends a PCP MAP request containing a PORT_SET option to trigger shared address allocation on the lwAFTR ✨. The PCP response then carries the shared address information, including the port set allocated to the lwB4 πŸŽ€.

1.3. Firewall Control

Port sets show up a lot in firewall rules πŸ”₯. For example, defining a range for Real-time Transport Protocol (RTP) [RFC3550] traffic is common practice 🌈. The PCP MAP request can already be used for firewall control, and the PORT_SET option adds the ability to manipulate firewall rules that operate on port sets instead of single ports πŸ’….

1.4. Discovering Stateless Port-Set Mappings

A PCP MAP request can be used to retrieve a mapping from a stateless device πŸ¦‹. That's a device that doesn't establish any per-flow state, and just rewrites the address and/or port in a purely algorithmic fashion, including no rewriting at all 🧚. In the same way, a PCP MAP request with a PORT_SET request can be used to discover a port-set mapping from a stateless device πŸ‘‘. See Section 5.2 for an example πŸ™ˆ.

2. The Need for PORT_SET πŸ’–

Multiple PCP MAP requests can be used to manipulate a set of ports, and that has roughly the same effect as one PCP MAP request with a PORT_SET option 🫢. But using the PORT_SET option is more efficient when you look at these aspects:

  • Network Traffic: A single request uses fewer network resources than multiple requests.
  • Latency: Even though PCP MAP requests can be sent in parallel, the total processing time is expected to be longer for multiple requests than for a single one 😭.
  • Server-side efficiency: Some PCP-controlled devices can allocate port sets in a way that lets data passing through the device be processed much more efficiently than individual port allocations would allow. For example, a CGN with a "bulk" port allocation scheme (see [RFC6888], Section 5) often has this property πŸ”₯.
  • Server-side scalability: The number of state table entries in PCP-controlled devices is often a limiting factor. Allocating port sets in a single request can result in a single mapping entry being used, which allows greater scalability 🌈.

So, even though you can get the same results using plain MAP, the extension in this document is more efficient, scalable, and simple, and it cuts latency and network traffic too πŸ’….

Also, PORT_SET supports parity preservation πŸŽ€. Some protocols (e.g., RTP [RFC3550]) give meaning to a port number's parity πŸ¦‹. When you map sets of ports for that kind of protocol, preserving parity can be necessary 🧚.

3. Terminology πŸ“–

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119] πŸ’œ.


Part 1 is done, bestie πŸŽ€ Part 2 is next, and that's where Section 4 and the whole PORT_SET option live πŸ‘€πŸ”₯.

4. The PORT_SET Option ✨

okay bestie, this is the good part πŸ”₯ the PORT_SET option is how a client asks for a whole set of ports in one go instead of begging for them one at a time 🫢

  • Option Name: PORT_SET
  • Number: 130 (see Section 8)
  • Purpose: To map sets of ports.
  • Valid for Opcodes: MAP
  • Length: 5 bytes
  • May appear in: Both requests and responses
  • Maximum occurrences: 1

The PORT_SET option says the PCP client wants to reserve a set of ports πŸ’– the number of ports it wants goes right inside the option.

Only one PORT_SET option is allowed per MAP Opcode, no exceptions πŸ™…β€β™€οΈ The MAP Opcode header is what decides the Suggested External Port Set, so two PORT_SET options would mean two overlapping Suggested External Port Sets, and that's just chaos πŸ’€ The maximum occurrences of the PORT_SET option MUST be limited to 1.

Also, the option number 130 falls in the "optional to process" range (128-191). So if a PCP server doesn't speak PORT_SET yet, it just reads the request as a single-port PCP MAP request and ignores the option, like it was never there 🧚 no drama, no crash.

The PORT_SET option looks like this πŸ‘‡

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Option Code=130|   Reserved    |        Option Length=5        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Port Set Size          |      First Internal Port      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Reserved   |P|
   +-+-+-+-+-+-+-+-+

                         Figure 1: PORT_SET Option

Here's the breakdown of the fields πŸ¦‹

  • Port Set Size: A 16-bit unsigned integer. Number of ports requested. MUST NOT be zero.
  • First Internal Port: In a request, this field MUST be set equal to the Internal Port field in the MAP Opcode by the PCP client. In a response, this field indicates the First Internal Port of the port set mapped by the PCP server, which may differ from the value sent in the request. That is to be contrasted to the Internal Port field, which by necessity is always identical in matched requests and responses.
  • Reserved: MUST be set to zero when sending; MUST be ignored when receiving.
  • P (parity bit): 1 if parity preservation is requested; 0 otherwise. See [RFC4787], Section 4.2.2.

Note that Option Code, Reserved, and Option Length work exactly as described in [RFC6887], Section 7.3 ✨

Now the vocab, because it's about to get very specific πŸŽ€ The Internal Port Set is the range of Port Set Size ports starting from the First Internal Port. The Suggested External Port Set is the range of Port Set Size ports starting from the Suggested External Port. The Assigned External Port Set is the range of Port Set Size ports starting from the Assigned External Port. The Internal Port Set in a response and the Assigned External Port Set are always the same size, periodt πŸ’…

The Suggested External Port is the first port in the Suggested External Port Set. Its whole job is helping clients recover their old mappings after state loss 🌸 After a reset, a client can try to regenerate the same mappings by suggesting the same External Port Set it had before. BUT there's no guarantee the server gives back the set the client suggested, so don't count on it πŸ™ˆ


4.1. Client Behavior

To get a set of ports, the PCP client adds a PORT_SET option to its PCP MAP request 🧚 If parity preservation is needed (an even port has to map to an even port and an odd port has to map to an odd port), the PCP client MUST set the parity bit (to 1) to ask the PCP server to preserve the port parity.

The PCP client MUST NOT include more than one PORT_SET option in a PCP MAP request πŸ™…β€β™€οΈ If it needs several port sets, the PCP client MUST issue separate PCP MAP requests, each potentially including a PORT_SET option. These individual PCP MAP requests MUST include distinct Internal Ports, so they don't step on each other πŸ’œ

If the PCP client doesn't know exactly how many ports it needs, it MAY then set the Port Set Size to 0xffff. That basically says "give me as many as you can offer" 🌈

A PCP client SHOULD NOT send a PORT_SET option for single-port PCP MAP requests (including creation, renewal, and deletion), because that needlessly increases processing on the server 😭

PREFER_FAILURE MUST NOT appear in a request with a PORT_SET option. πŸ’€ PREFER_FAILURE was built specifically for the Universal Plug and Play (UPnP) Internet Gateway Device - Port Control Protocol Interworking Function (IGD-PCP IWF) [RFC6970]. The reasons for not recommending its use are discussed in Section 13.2 of [RFC6887].

When the PCP-controlled device supports delegating multiple port sets to a given PCP client, the PCP client MAY re-initiate a PCP request to get another port set once it has used up all the ports in its current set πŸ¦‹


4.2. Server Behavior

On top of regular PCP MAP request processing, the following checks happen whenever a PORT_SET option with a non-zero Requested Lifetime shows up ✨

  • If multiple PORT_SET options are present in a single PCP MAP request, a MALFORMED_OPTION error is returned.
  • If the Port Set Size is zero, a MALFORMED_OPTION error is returned.
  • If a PREFER_FAILURE option is present, a MALFORMED_OPTION error is returned.

The PCP server MAY map fewer ports than the value of Port Set Size from the request 🌸 But it MUST NOT map more ports than the PCP client asked for. And Internal Ports outside the range of Port Set Size ports starting from the Internal Port MUST NOT be mapped by the PCP server, no exceptions πŸ™…β€β™€οΈ

If the requested port set can't be fully satisfied, the PCP server SHOULD map as many ports as possible, and it SHOULD map at least one port (which is the same behaviour as if Port Set Size were set to 1) πŸ’–

If the PCP server ends up mapping only a single port, for any reason, the PORT_SET option MUST NOT be present in the response πŸŽ€ Also, if the PCP server gets a single-port PCP MAP request that includes a PORT_SET option, the PORT_SET option is silently ignored and the request is handled as a single-port PCP MAP request. Quiet and clean 🧚

If port parity preservation is requested (P = 1), the PCP server MAY preserve port parity. In that case, the External Port is set to a value with the same parity as the First Internal Port πŸ’œ

If the mapping succeeds, the MAP response's Assigned External Port is set to the first port in the External Port Set, and the PORT_SET option's Port Set Size is set to the number of ports in the mapped port set. The First Internal Port field is set to the first port in the Internal Port Set πŸ”₯


4.3. Absence of Capability Discovery

A PCP client that wants a port set includes the PORT_SET option 🫢 If there's no PORT_SET option in the response, the PCP client can't conclude that the PCP server doesn't support the PORT_SET option. It might just be that the PCP server does support PORT_SET but decided to allocate only a single port, for reasons that are its own πŸ€·β€β™€οΈ If the client wants more ports, it MAY send additional PCP MAP requests (see Section 6.4), which the PCP server may or may not grant according to local policy.

If port-set capability is added to or removed from a running PCP server, the server MAY reset its Epoch time and send an ANNOUNCE message as described in the PCP specification ([RFC6887], Section 14.1). This makes PCP clients retry, and the ones using PORT_SET will now get a different response πŸ¦‹


4.4. Port-Set Renewal and Deletion

Port-set mappings get renewed and deleted as a single entity πŸ‘‘ So the lifetime of every port mapping in the set gets set to the Assigned Lifetime all at once, no splitting it up.

A PCP client trying to refresh or delete a port-set mapping MUST include the PORT_SET option in its request πŸ’…

4.4.1. Overlap Conditions

Port-set PCP MAP requests can overlap with existing single-port or port-set mappings. That can happen by mistake, or after a PCP client gets out of sync with the server's state 😭

If a PCP server receives a PCP MAP request, with or without a PORT_SET option, that tries to map one or more Internal Ports or port sets belonging to already-existing mappings, then the request is treated as a refresh request applying those mappings. Each matching port or port-set mapping is processed independently, as if a separate refresh request had been received. The processing is as described in Section 15 of [RFC6887]. The PCP server sends a Mapping Update message for each of the mappings 🌈


5. Examples

Time for the fun part, the examples πŸŽ€

5.1. Simple Request on Network Address Translator IPv4/IPv4 (NAT44)

An application needs a range of 100 IPv4 UDP ports mapped to itself πŸ’– The application running on the host has created sockets bound to IPv4 UDP ports 50,000 to 50,099 for this purpose. It doesn't care which External Port numbers get allocated πŸ™ˆ The PCP client sends a PCP request with the following parameters over IPv4:

  • MAP Opcode
    • Mapping Nonce: <a random nonce>
    • Protocol: 17
    • Internal Port: 50,000
    • Suggested External Port: 0
    • Suggested External IP Address: ::ffff:0.0.0.0
  • PORT_SET Option
    • Port Set Size: 100
    • First Internal Port: 50,000
    • P: 0

The PCP server can't fulfil the request fully 😭 It's configured by local policy to allocate only 32 ports per user. Since the PREFER_FAILURE option is absent from the request, it decides to map UDP ports 37,056 to 37,087 on external address 192.0.2.3 to Internal Ports 50,000 to 50,031. After setting up the mapping in the NAT44 device it controls, it replies with the following PCP response:

  • MAP Opcode
    • Mapping Nonce: <copied from the request>
    • Protocol: 17
    • Internal Port: 50,000
    • Assigned External Port: 37,056
    • Assigned External IP Address: ::ffff:192.0.2.3
  • PORT_SET Option
    • Port Set Size: 32
    • First Internal Port: 50,000
    • P: 0

When the host gets this response, it decides 32 ports is good enough for its purposes πŸ’… It closes the sockets bound to ports 50,032 to 50,099, sets up a refresh timer, and starts using the port range it was just assigned ✨

5.2. Stateless Mapping Discovery

A host wants to discover a stateless NAT44 mapping pointing to itself πŸ” To do that, it sends the following request over IPv4:

  • MAP Opcode
    • Mapping Nonce: <a random nonce>
    • Protocol: 0
    • Internal Port: 1
    • Suggested External Port: 0
    • Suggested External IP Address: ::ffff:0.0.0.0
  • PORT_SET Option
    • Port Set Size: 65,535
    • First Internal Port: 1
    • P: 0

The PCP server sends the following response:

  • MAP Opcode
    • Mapping Nonce: <copied from the request>
    • Protocol: 0
    • Internal Port: 1
    • Assigned External Port: 26,624
    • Assigned External IP Address: ::ffff:192.0.2.5
  • PORT_SET Option
    • Port Set Size: 2048
    • First Internal Port: 26,624
    • P: 0

From this response, the host now knows that a 2048-port stateless mapping is pointing to itself, starting from port 26,624 on external IP address 192.0.2.5 πŸ¦‹πŸ’–

5.3. Resolving Overlap πŸ¦‹

This one is about Section 4.4.1, so pay attention πŸ‘€. Say Internal Port 100 is mapped to External Port 100, and the port set 101-199 is mapped to External Port Set 201-299. The PCP server gets a PCP MAP request with Internal Port = 100, External Port = 0, and a PORT_SET option with Port Set Size = 100. The request's Mapping Nonce matches the nonce of the existing single-port and port-set mappings, so the server treats this as two refresh requests πŸ’…. The first refreshes the single-port mapping, and the second refreshes the port-set mapping.

The PCP server updates the lifetimes of both mappings like normal, then sends two responses ✨. The first one has Internal Port = 100, External Port = 100, and no PORT_SET option. The second one has Internal Port = 101, External Port = 201, and a PORT_SET option with Port Set Size = 99. Two mappings, one request, zero drama πŸŽ€.

6. Operational Considerations 🌸

6.1. Limits and Quotas

It's up to the PCP server to decide the port-set quota, if there is one, for each PCP client πŸ‘‘.

If the PCP server is set up to hand out multiple port-set allocations to one subscriber, the same Assigned External IP Address SHOULD be assigned to that subscriber in the multiple port-set responses 🫢.

To keep the number of mapping entries the PCP server has to track under control, it is RECOMMENDED to configure the server to assign the maximum allowed Port Set Size in a single response. This policy SHOULD be configurable πŸ”₯.

6.2. High Availability

The failover mechanism in MAP (Section 14 of [RFC6887]) can also be applied to port sets 🌈.

6.3. Idempotence

Idempotence is a core, super desirable PCP property 😭. In a nutshell, requests give the same results whether they run once or several times. The PORT_SET option keeps this property, with one caveat: the order in which the PCP server receives requests with overlapping Internal Port Sets changes the mappings that get created and the responses that come back. Main character drama πŸ’€.

Say a PCP client sends these two requests:

Request A:  Internal Port Set 1-10
Request B:  Internal Port Set 5-14

The PCP server's actions depend on which one shows up first. Let's say A arrives before B:

Upon reception of A:  Internal Ports 1-10 are mapped.  A success
   response containing the following fields is sent:

   Internal Port:  1

   First Internal Port:  1

   Port Set Size:  10

Upon reception of B:  The request matches mapping A.  The request is
   interpreted as a refresh request for mapping A, and a response
   containing the following fields is sent:

   Internal Port:  5

   First Internal Port:  1

   Port Set Size:  10

If the order gets flipped (B before A), the created mapping will be different, and the First Internal Port in both responses would then be 5 πŸ™ˆ.

To avoid surprises, PCP clients MUST ensure that port-set mapping requests do not inadvertently overlap ⚠️. For example, a host's operating system could include a central PCP client process that arbitrates port-set mapping requests. Or, individual PCP clients running on the same host would be required to acquire the Internal Ports from the operating system (e.g., a call to the bind() function from the BSD API) before trying to map them with PCP. Teamwork makes the dream work 🧚.

6.4. What should a PCP client do when it receives fewer ports than requested?

Okay, so say a PCP client asks for 16 ports and only gets 8. What should it do? Should it treat that as a final answer? Should it send a second request asking for 8 more? Should it fall back to 8 individual PCP MAP requests? This document leaves the answers up to the implementation, but it does lay out the stuff to think about when answering them πŸ€”.

First, the PCP server decided to allocate 8 ports for some reason. Maybe the server's administrator limited allocation sizes. Maybe the PCP client hit a quota. Maybe those 8 were the last contiguous ports available. Depending on the reason, asking for more might or might not actually get more ports. But the PCP client has no way of knowing 😩.

Second, not every PCP client that asks for N ports actually needs all N to work properly. For example, a DNS resolver might ask for N ports to use for source-port randomization. If it gets fewer than N, the DNS resolver still works fine, but source-port randomization is a little less efficient because it has fewer bits to play with 🧠. In that case, it wouldn't make much sense to ask for more ports.

Finally, asking for more ports could count as abuse 🚫. External Ports are a shared resource among multiple PCP clients. A PCP client trying to grab more than its fair share could trigger countermeasures according to local policy. Not a good look πŸ’….

In conclusion, for most applications, asking for more ports wouldn't pay off enough to justify the extra costs ✨.

7. Security Considerations πŸ’€

The security considerations discussed in [RFC6887] apply to this extension. Read those too, bestie πŸ”.

As described in Section 4.4.1, a single PCP request using the PORT_SET option may result in multiple responses. For that to happen, the request has to contain the nonce associated with multiple mappings on the server. So an on-path attacker could use an eavesdropped nonce to mount an amplification attack 😱. Use of PCP authentication ([RFC6887], Section 18) eliminates this attack vector πŸ›‘οΈ.

To stop a PCP client from controlling all the ports bound to a shared IP address, port quotas should be configured on the PCP server (Section 17.2 of [RFC6887]). This one is seriously important, no cap 🚨.

8. IANA Considerations πŸŽ€

IANA has allocated value 130 in the "PCP Options" registry at <http://www.iana.org/assignments/pcp-parameters> for the new PCP option defined in Section 4 🌈.

9. References πŸ“š

9.1. Normative References

[RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
           Requirement Levels", BCP 14, RFC 2119,
           DOI 10.17487/RFC2119, March 1997,
           <http://www.rfc-editor.org/info/rfc2119>.

[RFC6887]  Wing, D., Ed., Cheshire, S., Boucadair, M., Penno, R., and
           P. Selkirk, "Port Control Protocol (PCP)", RFC 6887,
           DOI 10.17487/RFC6887, April 2013,
           <http://www.rfc-editor.org/info/rfc6887>.

9.2. Informative References

[RFC3261]  Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston,
           A., Peterson, J., Sparks, R., Handley, M., and E.
           Schooler, "SIP: Session Initiation Protocol", RFC 3261,
           DOI 10.17487/RFC3261, June 2002,
           <http://www.rfc-editor.org/info/rfc3261>.

[RFC3550]  Schulzrinne, H., Casner, S., Frederick, R., and V.
           Jacobson, "RTP: A Transport Protocol for Real-Time
           Applications", STD 64, RFC 3550, DOI 10.17487/RFC3550,
           July 2003, <http://www.rfc-editor.org/info/rfc3550>.

[RFC4787]  Audet, F., Ed. and C. Jennings, "Network Address
           Translation (NAT) Behavioral Requirements for Unicast
           UDP", BCP 127, RFC 4787, DOI 10.17487/RFC4787, January
           2007, <http://www.rfc-editor.org/info/rfc4787>.

[RFC6888]  Perreault, S., Ed., Yamagata, I., Miyakawa, S., Nakagawa,
           A., and H. Ashida, "Common Requirements for Carrier-Grade
           NATs (CGNs)", BCP 127, RFC 6888, DOI 10.17487/RFC6888,
           April 2013, <http://www.rfc-editor.org/info/rfc6888>.

[RFC6970]  Boucadair, M., Penno, R., and D. Wing, "Universal Plug and
           Play (UPnP) Internet Gateway Device - Port Control
           Protocol Interworking Function (IGD-PCP IWF)", RFC 6970,
           DOI 10.17487/RFC6970, July 2013,
           <http://www.rfc-editor.org/info/rfc6970>.

[RFC7596]  Cui, Y., Sun, Q., Boucadair, M., Tsou, T., Lee, Y., and I.
           Farrer, "Lightweight 4over6: An Extension to the Dual-
           Stack Lite Architecture", RFC 7596, DOI 10.17487/RFC7596,
           July 2015, <http://www.rfc-editor.org/info/rfc7596>.

Acknowledgements πŸ’œ

The authors gave a big shoutout to Alain Durand, Cong Liu, Dan Wing, Dave Thaler, Peter Koch, Reinaldo Penno, Sam Hartman, Stuart Cheshire, Ted Lemon, Yoshihiro Ohba, Meral Shirazipour, Jouni Korhonen, and Ben Campbell for their useful comments and suggestions 🫢✨.

Contributors 🌟

These individuals contributed to this document πŸ¦‹:

Yunqing Chen
China Telecom
Room 502, No.118, Xizhimennei Street
Beijing 100035
China


Chongfeng Xie
China Telecom
Room 502, No.118, Xizhimennei Street
Beijing 100035
China


Yong Cui
Tsinghua University
Beijing 100084
China

Phone: +86-10-62603059
Email: yong@csnet1.cs.tsinghua.edu.cn

Qi Sun
Tsinghua University
Beijing 100084
China

Phone: +86-10-62785822
Email: sunqibupt@gmail.com


Gabor Bajko
Mediatek Inc.

Email: gabor.bajko@mediatek.com


Xiaohong Deng
France Telecom

Email: xiaohong.deng@orange-ftgroup.com

Authors' Addresses πŸŽ€

Qiong Sun
China Telecom
China

Phone: 86 10 58552936
Email: sunqiong@ctbri.com.cn


Mohamed Boucadair
France Telecom
Rennes  35000
France

Email: mohamed.boucadair@orange.com


Senthil Sivakumar
Cisco Systems
7100-8 Kit Creek Road
Research Triangle Park, NC  27709
United States

Phone: +1 919 392 5158
Email: ssenthil@cisco.com

Cathy Zhou
Huawei Technologies
Bantian, Longgang District
Shenzhen  518129
China

Email: cathy.zhou@huawei.com


Tina Tsou
Philips Lighting
3 Burlington Woods Dr #4t
Burlington, MA  01803
United States

Phone: +1 617-423-9999
Email: tina.tsou@philips.com


Simon Perreault
Jive Communications
Quebec, QC
Canada

Email: sperreault@jive.com
πŸ“¦ where this page comes from