2

Мне интересно, может ли TCP-клиент использовать один и тот же порт для подключения к различным удаленным TCP-серверам или нет?

В сетевом программировании есть две функции: sendto и send . Когда мы используем send нам не нужно указывать пункт назначения. Похоже, это означает, что подключенный сокет tcp может быть связан только с одним (src ip, src port, dst ip, dst port) 4-кортежем.

Могу ли я сделать что-то вроде:

 sockfd=socket(AF_INET,SOCK_STREAM,0);

 bzero(&cliaddr,sizeof(cliaddr));
 cliaddr.sin_family = AF_INET;
 cliaddr.sin_addr.s_addr=inet_addr(local_ip);
 cliaddr.sin_port=htons(32000);

 bind(listenfd,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
 connect(sockfd, (struct sockaddr *)&servaddr1, sizeof(servaddr1));
 connect(sockfd, (struct sockaddr *)&servaddr2, sizeof(servaddr2));

 sendto(sockfd, buf, len, 0, (struct sockaddr *)&servaddr1, socklen);
 sendto(sockfd, buf, len, 0, (struct sockaddr *)&servaddr2, socklen);

например, возможно ли, что у http-прокси может не хватить портов и придется ли повторно использовать порты?

3 ответа3

1

Чтобы ответить на этот вопрос, нам может потребоваться провести различие между TCP, независимым от API протоколом и BSD Sockets, наиболее известным и широко распространенным API, с помощью которого приложения получают доступ к функциям TCP-стеков своих ОС.

TCP, протокол, как вы уже заметили, рассматривает каждый 4-кортеж (src ip, src port, dst ip, dst port) как отдельное соединение. Измените любой из элементов в этом 4-кортеже, и это совершенно отдельное соединение. Итак, да, протокол TCP может обрабатывать несколько соединений с одного IP-адреса источника и порта источника.

Вопрос о том, есть ли простой способ получить доступ к этой функциональности из почтенного API BSD Sockets, может быть другим вопросом.

0

Насколько мне известно, да, они могут.

Зависит от приложения (в этом примере, скажем, http, который использует порт 80), соединения повторно используют порты выше 1024. Все порты от 0 до 1024 зарезервированы для определенного использования. Все, что выше 1024, является честной игрой для любого приложения.

Таким образом, при загрузке веб-страницы вы начинаете с запроса HTTP (порт 80), но затем все входящие подключения, файлы и изображения запрашиваются одновременно, ваш локальный компьютер выбирает случайные неиспользуемые порты для подключения к сети. сервер на порту 80.

Безопасность grc.com теперь имеет хорошее объяснение о TCP и как он работает здесь: https://www.grc.com/sn/past/2011.htm - TCP, часть 1 - подключение

Я уверен, что у других экспертов будет свой метод объяснения вещей, но это тот, который я могу найти сейчас.

Также достаточно интересно, что есть веб-сайт под названием http://www.askmisterwizard.com/, который занимается созданием иллюстраций / видеороликов об эпизодах безопасности в настоящее время, и у них есть 2 иллюстративных видео о том, как работает интернет, которые могут быть полезны для изучения (если вы найдете подкаст слишком многословный, и не хватает графики)

Надеюсь это поможет.

0

TCP, насколько я знаю, не может переключать порты во время соединения. Клиенту необходимо закрыть или отказаться от этого соединения, а затем запустить новое, если он хочет использовать другой исходный порт на своем конце.

Ничто не мешает приложению реализовать что-либо в этом TCP-потоке, которое говорит клиенту запустить другое соединение на новом порту. FTP вроде делает это с PASV, если я правильно помню. Но это не особенность самого TCP.

Я полагаю, что большинство операционных систем позволяют вам настраивать допустимый диапазон исходящих портов для соединений TCP, и да, вы можете исчерпать их (маловероятно, если ваш диапазон очень мал), и да, они используются повторно. Читать это: http://www.cyberciti.biz/tips/linux-increase-outgoing-network-sockets-range.html

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .