SOCKS 4A: A Simple Extension to SOCKS 4 Protocol Ying-Da Lee yingda@best.com or yingda@esd.sgi.com Please read SOCKS4.protocol first for an description of the version 4 protocol. This extension is intended to allow the use of SOCKS on hosts which are not capable of resolving all domain names. In version 4, the client sends the following packet to the SOCKS server to request a CONNECT or a BIND operation: +----+----+----+----+----+----+----+----+----+----+....+----+ | VN | CD | DSTPORT | DSTIP | USERID |NULL| +----+----+----+----+----+----+----+----+----+----+....+----+ # of bytes: 1 1 2 4 variable 1 VN is the SOCKS protocol version number and should be 4. CD is the SOCKS command code and should be 1 for CONNECT or 2 for BIND. NULL is a byte of all zero bits. For version 4A, if the client cannot resolve the destination host's domain name to find its IP address, it should set the first three bytes of DSTIP to NULL and the last byte to a non-zero value. (This corresponds to IP address 0.0.0.x, with x nonzero. As decreed by IANA -- The Internet Assigned Numbers Authority -- such an address is inadmissible as a destination IP address and thus should never occur if the client can resolve the domain name.) Following the NULL byte terminating USERID, the client must sends the destination domain name and termiantes it with another NULL byte. This is used for both CONNECT and BIND requests. A server using protocol 4A must check the DSTIP in the request packet. If it represent address 0.0.0.x with nonzero x, the server must read in the domain name that the client sends in the packet. The server should resolve the domain name and make connection to the destination host if it can. SOCKSified sockd may pass domain names that it cannot resolve to the next-hop SOCKS server.