Назад | Перейти на главную страницу

Как работает связь через порты

Я изучал программирование сокетов, и у меня возникли определенные вопросы. Это некоторые сомнения начального уровня

  1. Обязательно ли использовать известный порт для конкретного приложения. Например, если я использую ssl, могу ли я спроектировать сервер для прослушивания на 1000, а не на 443.

  2. Для http мы подключаемся к порту 80 с другого произвольного порта. Почему нет связи порта 80 с портом 80.

  3. как сервер реагирует на соединения, поступающие к нему с разных портов на его порт 80.

  4. сколько подключений возможно к конкретному

  1. Нет, это не обязательно, но некоторые приложения ожидают такого поведения по умолчанию (это делает приложение более удобным, поскольку вам не нужно явно указывать порт). Например, когда вы переходите на веб-сайт example.com, вам не нужно указывать порт, так как по умолчанию он 80. Если вы хотите подключиться к веб-серверу на другом порту, вам необходимо явно указать этот порт. Иногда люди намеренно меняют порты, например, 22-й порт SSH, чтобы меньше беспокоить фоновый шум Интернета.
  2. Нет причин, по которым вам это нужно. Предположим, что вы используете веб-сервер на порту 80 и хотите перейти на веб-сайт, вы не сможете этого сделать, поскольку другой сервис использует этот порт. Как я сказал в 1, порты просто есть, поэтому вам не нужно указывать их, когда вы хотите подключиться к службе, если только эта служба не запускается на порте, отличном от порта по умолчанию.
  3. Это будет зависеть от того, что прослушивает его порт 80, веб-серверы будут отвечать по протоколу HTTP. Если по какой-то причине вы используете SSH на этом порту, он ответит SSH.
  4. Однако ограничений на конкретный порт нет. Однако существует ограничение на количество одновременных подключений, обычно ограниченное количеством файловых дескрипторов, поддерживаемых ядром (например, 2048). (переполнение стека)

1 - Речь идет как раз о «стандартах». По умолчанию ваш браузер достигает порта 443, если вы укажете https, и 80, если, например, http. Вы можете делать все, что захотите для вашего конкретного использования, но вам нужно будет указать свой собственный порт следующим образом: some.place.to.go: 1000. Вы можете использовать «зарезервированные и хорошо известные» порты (0-1023) для соответствующие службы, но если вам нужен / вы хотите использовать другой, решать вам ... помните, у вас их более 65k :)

2- потому что порты <1024 зарезервированы и не могут быть использованы для инициации соединения

3- мы говорим о TCP-соединениях ... На конкретной машине номер порта в сочетании с IP-адресом машины называется сокетом. Комбинация IP и порта на клиенте и сервере известна как четыре кортежа. Эти четыре кортежа однозначно идентифицируют соединение. Таким образом, сервер может разговаривать со многими клиентами, потому что каждый клиент создал уникальное соединение с сервером, чтобы поговорить с ним.

Пример: клиент (cli) подключается к серверу (srv) с порта клиента (5432) на порт сервера (80) cli: 5432 -> srv: 80

Сервер ответит клиенту на том же клиентском порту: srv: 80 -> cli: 5432 И так далее ...

Итак, для 2) вопроса: - представьте, что на стороне клиента запущен http-сервер, «локальный» порт 80 уже используется. - представьте, что за маршрутизатором находится несколько клиентов (только с 1 IP ...), как многие клиенты могут использовать один и тот же исходный порт?

Если соединение было выполнено через порт 80, а не через произвольный порт, ни одна из этих ситуаций не будет работать. вот почему нам нужно использовать произвольный порт для инициирования запроса!

4- от IP до мира, максимум 65535 (потому что вы можете привязать только 65k сокетов ... поскольку у вас только 65k портов)

Если вы хотите углубиться в это, я рекомендую вам прочитать это:

http://en.wikipedia.org/wiki/Internet_protocol_suite (и связанные статьи ...)

http://www.thegeekstuff.com/2011/11/tcp-ip-fundamentals/