Why would a port number ever be used to tell what kind of application data protocol resides inside when there's not absolute guarantee?
Porque a adivinhação é uma maneira terrível de executar as coisas, e não há como você parar, por exemplo, alguém mal-intencionado de enviar a coisa errada de qualquer maneira. Então, isso ajuda no caso em que todo mundo está jogando bem e não faz nada pior.
To my understanding, there are no restrictions to what kind of application data you send over a port (it's just a suggestion).
Correto. Na verdade, não é nem uma sugestão, apenas um acordo que muitas pessoas compartilham.
Plus isn't the protocol data already included somewhere in the packet for this purpose?
Não. Pelo menos, não no nível que a porta geralmente indica: você sabe que tipo de protocolo IP de nível mais alto está sendo enviado (por exemplo: TCP, UDP), mas não qual é o conteúdo disso (por exemplo: HTTP, SMTP). / p>
Also, What happens to the data if you send HTTP or some other kind of protocol to a destination of port 25 (which expects SMTP)?
O TCP apenas passa os dados para a camada de aplicativo, que pode fazer qualquer coisa que desejar. Na maioria das vezes, você só recebe erros. Às vezes você tem falhas de segurança exploráveis.
Ocasionalmente, você obtém um bom comportamento para clientes incorretos, como os erros HTTP de texto simples que alguns servidores HTTPS fornecem quando você não usa SSL na porta.
Third, what happens to the data if you send it to a port that isn't bound with any program, and therefore not being listened to?
Você recebe uma mensagem de erro ICMP do sistema de recebimento. Tecnicamente, o receptor poderia fazer o que quisesse, mas na prática, é isso que acontece.
Finally, if a port can only be bound to a single program, how can multiple programs that depend on incoming HTTP data be running on my computer at the same time?
Quando o seu navegador faz uma conexão HTTP com um servidor remoto, ele usa uma porta local aleatória e fala com a porta conhecida (80 ou 443) no servidor remoto. Nesse caso, o é exclusivo para cada conexão de saída distinta. (Embora, tecnicamente, não tem que ser, como para o caso do servidor.)
No lado do servidor, quando você ouve, apenas um processo pode aceitar novas conexões em uma porta (em soquetes Unix / BSD), mas pode passar a conexão estabelecida para outros processos para o serviço. Como o conjunto é único, o tráfego pode ser roteado para a conexão correta.