1.Часто браузер для одного сайта открывает не одно соединение, а сразу пачку и качает ресурсы параллельно. Порты в этом случае для каждого соединения разные. Кроме того на одной странице могут быть ссылки ведущие на разные сайты, для них браузер открывает новые соединения.
2.Как было сказано порт выбирает ОС. При открытии сокета браузер указывает, что нужен "любой локальный порт". Считайте, что ОС выбирает первый свободный порт из
динамического диапазона. На самом деле сложнее, конечно, но конкретный алгоритм обычно не важен.
3.В общем случае шлюз с NAT подменяет и адрес и порт, поэтому сервер увидит не адрес и порт отправителя, а адрес и порт шлюза. Все это происходит прозрачно для сервера и для клиента. Клиент думает, что он общается на прямую с сервером, а сервер думает, что клиент - это шлюз с NAT и не подозревает, что по пути пакета реальный адрес/порт клиента был подменен NATом.