La Fibre

Télécom => Réseau => reseau TCP/IP / Fonctionnement des réseaux => Discussion démarrée par: corrector le 10 décembre 2015 à 18:25:48

Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: corrector le 10 décembre 2015 à 18:25:48
Effectivement, il est intéressant de savoir comment est fait le partage en 4, si un abonné à les ports 0 à 16383, le second les ports 16384 à 32767, ect...

Il n'y a pas de port 0.
Titre: Le port 0 existe-t-il ?
Posté par: PacOrly le 10 décembre 2015 à 18:43:09
Il n'y a pas de port 0.

Il me semblait qu'il y avait 2^16 ports, numérotés de 0 à 65535.
Titre: Le port 0 existe-t-il ?
Posté par: corrector le 10 décembre 2015 à 18:54:33
Le port UDP et TCP utilisent bien des numéros de ports sur 16 bits, ce qui donne 2^16 valeurs possibles pour chaque port (source et destination), ce qui ne veut pas dire que toutes les valeurs sont possibles.
Titre: Le port 0 existe-t-il ?
Posté par: Snickerss le 10 décembre 2015 à 18:56:05
On peut pas utiliser le port de sous réseaux  ;D  (désolé je sors)
Titre: Le port 0 existe-t-il ?
Posté par: PacOrly le 10 décembre 2015 à 18:59:34
Le port UDP et TCP utilisent bien des numéros de ports sur 16 bits, ce qui donne 2^16 valeurs possibles pour chaque port (source et destination), ce qui ne veut pas dire que toutes les valeurs sont possibles.

Il semble bien exister. (http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml)
Titre: Le port 0 existe-t-il ?
Posté par: Thornhill le 10 décembre 2015 à 19:01:30
Il me semblait qu'il y avait 2^16 ports, numérotés de 0 à 65535.

Pas valide :

Citer
   0    tcp    Reserved             
   0    udp    Reserved
Titre: Le port 0 existe-t-il ?
Posté par: kgersen le 10 décembre 2015 à 19:02:00
Il me semblait qu'il y avait 2^16 ports, numérotés de 0 à 65535.

oui mais '0' peut poser des problèmes a cause de certaines implèmentations de TCP ou UDP et de certaines API et logiciels, donc on évite de s'en servir. Mais en théorie on pourrait. L'IANA l'a donc marqué comme "réservé".
Titre: Le port 0 existe-t-il ?
Posté par: PacOrly le 10 décembre 2015 à 19:04:40
Pas valide :

Donc, il existe.
Titre: Le port 0 existe-t-il ?
Posté par: PacOrly le 10 décembre 2015 à 19:05:57
oui mais '0' peut poser des problèmes a cause de certaines implèmentations de TCP ou UDP et de certaines API et logiciels, donc on évite de s'en servir. Mais en théorie on pourrait. L'IANA l'a donc marqué comme "réservé".

Donc, il y a bien un port 0.
Titre: Le port 0 existe-t-il ?
Posté par: fmauNeko le 10 décembre 2015 à 19:10:35
En TCP ou en UDP, le port 0 existe mais est réservé. Sur d'autres protocoles de couche Transport ça peut etre différent.
Titre: Le port 0 existe-t-il ?
Posté par: corrector le 10 décembre 2015 à 19:16:58
Il semble bien exister. (http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml)
Cela commence bien :

Service Name and Transport Protocol Port Number Registry - RFC 6335 (http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml)
Citer
based on three ranges: System
Ports (0-1023), User Ports (1024-49151), and the Dynamic and/or Private
Ports (49152-65535);
Foutaise absolue, il n'y a aucun port privé ou dynamique ou utilisateur.

Les ports à partir de 1024 sont sémantiquement équivalents. L'implèmentation TCP/UDP ne fait absolument aucune différence entre eux.
Titre: Le port 0 existe-t-il ?
Posté par: PacOrly le 10 décembre 2015 à 19:19:30
Il n'y a pas de port 0.

Je parle exclusivement de çà.
Titre: Le port 0 existe-t-il ?
Posté par: kgersen le 10 décembre 2015 à 19:31:43
Foutaise absolue, il n'y a aucun port privé ou dynamique ou utilisateur.

si tu n'as juste pas compris a quoi ca sert.

lit: http://tools.ietf.org/html/rfc6335#section-6
et : http://tools.ietf.org/html/rfc6335#section-8.1.2

Donc, il existe.

oui tout a fait. mais il ne faut pas l'utiliser car dans l'avenir l'IANA pourrait decider de l'utiliser pour une extension ou autre:

Citer
   o  Reserved: Reserved port numbers are not available for regular
      assignment; they are "assigned to IANA" for special purposes.
      Reserved port numbers include values at the edges of each range,
      e.g., 0, 1023, 1024, etc., which may be used to extend these
      ranges or the overall port number space in the future.

Titre: Le port 0 existe-t-il ?
Posté par: corrector le 10 décembre 2015 à 19:37:13
La valeur 0 n'est pas un numéro de port, c'est tout.
Titre: Le port 0 existe-t-il ?
Posté par: PacOrly le 10 décembre 2015 à 19:42:36
Nous resterons donc en désaccord sur ce point.
Titre: Le port 0 existe-t-il ?
Posté par: Darklight le 10 décembre 2015 à 19:56:16
Jamais utilisé le port 0 mais il existe, après il faut bien trouver une application qui écoute sur ce port pour le sortir de la catégorie légende urbaine. Faut voir aussi pour le NAT s'il serait possible vers un port 0.

Pour l'info il existe aussi des protocoles qui n'utilisent pas de ports, comme ICMP.
Titre: Le port 0 existe-t-il ?
Posté par: cali le 10 décembre 2015 à 20:14:00
On peut tout à fait utiliser le port 0 en tcp/udp. Le problème c'est juste que dans beaucoup d'implèmentations il est utiliser pour sélectionner le premier port local disponible et beaucoup de programmes le considère invalide mais j'ai déjà essayé et ça marche normalement.
Titre: Le port 0 existe-t-il ?
Posté par: corrector le 10 décembre 2015 à 20:19:32
On peut tout à fait utiliser le port 0 en tcp/udp. Le problème c'est juste que dans beaucoup d'implèmentations il est utiliser pour sélectionner le premier port local disponible et beaucoup de programmes le considère invalide mais j'ai déjà essayé et ça marche normalement.
Tu as testé sur quel OS?

Reserved signifie INTERDIT!
Titre: Le port 0 existe-t-il ?
Posté par: eruditus le 10 décembre 2015 à 20:24:30
reserved != forbidden
Titre: Le port 0 existe-t-il ?
Posté par: cali le 10 décembre 2015 à 20:28:22
Tu as testé sur quel OS?

OpenBSD/Linux
Titre: Le port 0 existe-t-il ?
Posté par: Breizh 29 le 10 décembre 2015 à 20:30:07
De toute façon les ports de 0 à 1024 sont réservé, donc pas la peine d'épiloguer on ne peut pas s'en servir.
Après il y a du choix  ::)
Titre: Le port 0 existe-t-il ?
Posté par: corrector le 10 décembre 2015 à 20:51:30
OpenBSD/Linux
Tu as encore le programme?
Titre: Le port 0 existe-t-il ?
Posté par: cali le 10 décembre 2015 à 21:02:00
Tu as encore le programme?

Prends n'importe quoi, comme un apache, tu le fais écouter sur le port 80 et tu fais une redirection du port 0 vers 80 avec iptables ou pf. Ensuite tu peux faire une requête avec curl et ça passe. Ca marche aussi avec Chrome, Firefox n'aime pas par contre.
Titre: Le port 0 existe-t-il ?
Posté par: corrector le 10 décembre 2015 à 21:05:01
Prends n'importe quoi, comme un apache, tu le fais écouter sur le port 80 et tu fais une redirection du port 0 vers 80 avec iptables ou pf. Ensuite tu peux faire une requête avec curl et ça passe. Ca marche aussi avec Chrome, Firefox n'aime pas par contre.
Intéressant!
Titre: Le port 0 existe-t-il ?
Posté par: Thornhill le 10 décembre 2015 à 21:05:58
Les ports à partir de 1024 sont sémantiquement équivalents. L'implèmentation TCP/UDP ne fait absolument aucune différence entre eux.

C'est inexact, cf ip_local_port_range/ip_local_reserved_ports sous Linux.
De plus "l'implèmentation TCP/UDP" ne veut rien dire, il y a des implèmentations avec des paramétrages différents à ce niveau.



Titre: Le port 0 existe-t-il ?
Posté par: corrector le 10 décembre 2015 à 21:12:32
Quel rapport avec la RFC précitée?
Titre: Le port 0 existe-t-il ?
Posté par: kgersen le 10 décembre 2015 à 21:20:42
Chrome sur Windows 10:

https://lafibre.info:0/ -> ERR_ADDRESS_INVALID (c'est l'OS qui répond ca, on voit un appel systeme dans le tracing de Chrome)
https://lafibre.info:1/ -> ERR_UNSAFE_PORT (c'est Chrome qui bloque ca avec sa liste de 'restricted port' (voir source  (http://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc?view=markup)ligne 70).)
https://lafibre.info:2/ -> ERR_CONNECTION_REFUSED (le paquet quitte bien la machine, c'est le serveur de lafibre qui n'ecoute pas sur le port 2 donc normal)
https://lafibre.info:3/ -> idem port 1
Titre: Le port 0 existe-t-il ?
Posté par: Paulo31 le 10 décembre 2015 à 21:28:58
Edge windows 10 affiche le site avec le port :0, a priori il ignore juste le truc :D

sur 1/2/3, connexion refusée
Titre: ERR_UNSAFE_PORT
Posté par: corrector le 10 décembre 2015 à 21:30:12
https://lafibre.info:1/ -> ERR_UNSAFE_PORT (c'est Chrome qui bloque ca avec sa liste de 'restricted port' (voir source  (http://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc?view=markup)ligne 70).)
En effet, les navigateurs peuvent être utilisés pour ouvrir des connexions depuis l'intérieur d'une zone protégée par un pare-feu. Et même sans pare-feu, le navigateur peut être utilisé pour ouvrir des connexions depuis une IP locale ou de confiance.

C'est un problème intrinsèque au Web tel que conçu initialement.
Titre: Le port 0 existe-t-il ?
Posté par: cali le 10 décembre 2015 à 21:35:59
curl -H "Host: ns3.urdn.com.ua" http://ns3.urdn.com.ua:0

Marche bien avec Chrome (chromium) aussi.
Titre: Le port 0 existe-t-il ?
Posté par: corrector le 10 décembre 2015 à 21:37:37
Sous linux?
Titre: Le port 0 existe-t-il ?
Posté par: cali le 10 décembre 2015 à 21:42:39
Sous linux?

OpenBSD/Linux
Titre: Le port 0 existe-t-il ?
Posté par: PacOrly le 10 décembre 2015 à 23:23:33
Alors pourquoi tu introduis un guide des bonnes manières et pourquoi tu l'interprètes à l'envers?

Reserved signifie INTERDIT!

Si il est interdit, c'est qu'il existe. Donc, il y a un bien un port 0.
Titre: Le port 0 existe-t-il ?
Posté par: Darklight le 10 décembre 2015 à 23:34:57
Avec une vieille version de Nmap (nmap -p 0-3 -T4 -A -v lafibre.info) :

C'est intéressant, seul le port 0 affiche un port filtré tandis que les autres sont closed. Donc ça prouve que quelque chose passe par le port 0, mais avec Firefox, ses protections bloquent l'accès comme d'autres ont remarqués. Un wget n'a rien donné non plus.
Titre: Le port 0 existe-t-il ?
Posté par: cali le 10 décembre 2015 à 23:40:36
Avec une vieille version de Nmap (nmap -p 0-3 -T4 -A -v lafibre.info) :

C'est intéressant, seul le port 0 affiche un port filtré tandis que les autres sont closed. Donc ça prouve que quelque chose passe par le port 0, mais avec Firefox, ses protections bloquent l'accès comme d'autres ont remarqués. Un wget n'a rien donné non plus.

Il n'y a rien qui écoute sur ces ports sur lafibre.info alors à quoi tu t'attends ?
Titre: Le port 0 existe-t-il ?
Posté par: Darklight le 10 décembre 2015 à 23:41:53
Kgersen à donné des liens avec ces ports

Citer
Chrome sur Windows 10:

https://lafibre.info:0/ -> ERR_ADDRESS_INVALID (c'est l'OS qui répond ca, on voit un appel systeme dans le tracing de Chrome)
https://lafibre.info:1/ -> ERR_UNSAFE_PORT (c'est Chrome qui bloque ca avec sa liste de 'restricted port' (voir source ligne 70).)
https://lafibre.info:2/ -> ERR_CONNECTION_REFUSED (le paquet quitte bien la machine, c'est le serveur de lafibre qui n'ecoute pas sur le port 2 donc normal)
https://lafibre.info:3/ -> idem port 1
Titre: Le port 0 existe-t-il ?
Posté par: cali le 10 décembre 2015 à 23:50:27
Kgersen à donné des liens avec ces ports

Ca change pas, que ça soit l'OS qui bloque ou pas, t'aura toujours rien parce qu'il n'y a rien qui écoute sur ce port à cette adresse.
Titre: Le port 0 existe-t-il ?
Posté par: corrector le 11 décembre 2015 à 00:54:17
Ca change pas, que ça soit l'OS qui bloque ou pas, t'aura toujours rien parce qu'il n'y a rien qui écoute sur ce port à cette adresse.
ERR_CONNECTION_REFUSED ce n'est pas rien!
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: BadMax le 11 décembre 2015 à 09:25:50
root@tao:/projets/netcat# ./nc -l -p 0
invalid local port 0
root@tao:/projets/netcat# ./nc -l -p 1
^C punt!
root@tao:/projets/netcat#

Je dis ça je dis rien...

(4 pages de topic pour une histoire de 0, killing-spreeeeeeee !!!!)
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: PacOrly le 11 décembre 2015 à 10:57:59
Le port 0 est bien utilisé et a toute son utilité.

http://compnetworking.about.com/od/tcpip/p/port-numbers-0.htm
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: BadMax le 11 décembre 2015 à 11:54:13
Euh... t'as lu l'article ? :D

"Port 0 is officially a reserved port in TCP/IP networking, meaning that it should not be used for any TCP or UDP network communications."

"port 0 is a programming technique for specifying system-allocated (dynamic) ports"

"[] network programmers can instead specify port 0 as a connection parameter. That triggers the operating system to automatically search for and return the next available port in the dynamic port number range."

Donc si tu demandes le port 0 on t'en donne un automatiquement. Tu ne peux pas l'utiliser directement.
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: PacOrly le 11 décembre 2015 à 12:58:21
La discussion est de savoir si :

Il n'y a pas de port 0.

ou de savoir si il y a un port 0.

Ceci "Port 0 is officially a reserved port in TCP/IP networking" me suffit amplement pour affirmer qu'il y a bien un port 0, et son utilité est décrite dans le lien donné.

Après que ce port puisse ou ne puisse pas être ouvert physiquement sur une machine est un autre débat.
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: Snickerss le 11 décembre 2015 à 15:08:30
Est ce que l'ensemble vide est lui même un ensemble puisqu'il est vide ?

=> vous avez 4 heures.
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: vtimd le 11 décembre 2015 à 15:16:16
Est ce que l'ensemble vide est lui même un ensemble puisqu'il est vide ?

=> vous avez 4 heures.

OUI

https://fr.wikipedia.org/wiki/Ensemble_vide
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: PacOrly le 11 décembre 2015 à 15:19:18
Est ce que l'ensemble vide est lui même un ensemble puisqu'il est vide ?

=> vous avez 4 heures.

Réponse en 6 minutes...
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: corrector le 11 décembre 2015 à 15:26:39
Est ce que l'ensemble vide est lui même un ensemble puisqu'il est vide ?

=> vous avez 4 heures.
En théorie des ensembles il existe axiomatiquement. Tous les ensembles qu'on peut construire sont basés sur l'ensemble vide : ∅, {∅}, {∅, {∅}}, etc.

L'ensemble des entiers correspond à { ∅, {∅}, {∅, {∅}}, ... }

Par ailleurs, sans ensemble vide on ne peut pas définir l'intersection de deux ensembles disjoints.

Se passer d'ensemble vide est l'équivalent à se passer de 0 en arithmétique.
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: BadMax le 11 décembre 2015 à 15:27:47
C'est pas faux.
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: corrector le 11 décembre 2015 à 15:29:55
Réponse en 6 minutes...
Réponse de matheux en 6 minutes. En math, quand tu as 4 h, tu as au plus 4 h, il n'est pas interdit de torcher la démonstration en 4 lignes.

En philo, quand tu as 4 h, tu as intérêt à occuper les 4 h et à pondre au moins 4 pages.
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: corrector le 11 décembre 2015 à 15:33:55
C'est pas faux.
Pour détailler un peu plus :

0 correspond à ∅ qui signifie {}
1 correspond à {∅} qui signifie {{}}
etc.

On utilise à chaque fois l'axiome de la paire pour démontrer l'existence de l'ensemble.

Il y a un axiome qui garantit l'existence de l'ensemble des entiers, parce qu'on ne peut pas construire un ensemble infini avec les autres axiomes.
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: Breizh 29 le 11 décembre 2015 à 20:52:35
Ah les matheux  ::)
Titre: Le port 0 existe-t-il ?
Posté par: corrector le 12 décembre 2015 à 07:24:27
reserved != forbidden
"forbidden" n'existe pas dans les RFC!
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: tom pouce le 12 décembre 2015 à 09:54:49
 Pour en revenir au sujet, j'ai retenu d'un papier lu en cours de sécurité l'an dernier que les attaques sur le port 0 étaient une faille connue : les firewalls habituels sont souvent un peu trop surs que les OS refuseront que l'utilisateur envoient quoi que ce soit sur ce port, tellement qu'il était ouvert par défaut et que les OS laissaient des failles béantes à ceux qui avaient l'idée de s'amuser avec ce port.
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: corrector le 12 décembre 2015 à 10:22:19
De toute façon, personne ne va mettre un serveur sur un port 0, même en supposant que ça soit possible.

Donc je ne vois pas le souci.
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: mattmatt73 le 12 décembre 2015 à 11:48:07
De toute façon, personne ne va mettre un serveur sur un port 0, même en supposant que ça soit possible.

Donc je ne vois pas le souci.

et pourquoi pas ?

personne ne pensera à aller le chercher là ... Pour certaines applications
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: Breizh 29 le 12 décembre 2015 à 12:19:29
(http://www.smiley-lol.com/smiley/manger/grignoter/mais4.gif)
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: BadMax le 12 décembre 2015 à 14:36:12
Dans Linux, le port n'est pas utilisable par bind() :
Je cite http://unix.stackexchange.com/questions/180492/is-it-possible-to-connect-to-tcp-port-0
Citer
There's a comment about this in [linux kernel source]/net/ipv4/inet_connection_sock.c on inet_csk_get_port():

/* Obtain a reference to a local port for the given sock,
 * if snum is zero it means select any available local port.
 */

Which is a standard unix convention. There could be systems that will actually allow use of port 0, but that would be considered a bad practice. This behaviour is not officially specified by POSIX, IANA, or the TCP protocol, however.

Sinon IRL vous n'avez rien de plus intéressant à débattre ?
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: mattmatt73 le 12 décembre 2015 à 14:58:48
Dans Linux, le port n'est pas utilisable par bind() :
Je cite http://unix.stackexchange.com/questions/180492/is-it-possible-to-connect-to-tcp-port-0
Sinon IRL vous n'avez rien de plus intéressant à débattre ?

on pourrait parler du résultat des élections de demain, mais vu le niveau, c'est plus intéressant l'histoire du port 0
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: corrector le 12 décembre 2015 à 15:03:03
Pour demain je prédis que le gagnant sera NUL et ses propositions applicables proches de l'ensemble VIDE.
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: mattmatt73 le 12 décembre 2015 à 18:48:23
Pour demain je prédis que le gagnant sera NUL et ses propositions applicables proches de l'ensemble VIDE.

tu es méchant, le budget régional n'est pas contraint sur au moins 10%.....
Titre: Le port 0 existe-t-il ?
Posté par: corrector le 27 mars 2016 à 09:58:03
Sous linux :

Appel à socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)

985 static const struct net_proto_family inet_family_ops = {
986         .family = PF_INET,
987         .create = inet_create,

http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L985

249 static int inet_create(struct net *net, struct socket *sock, int protocol,
250                        int kern)
251 {
...
269         list_for_each_entry_rcu(answer, &inetsw[sock->type], list) {


Contenu de la variable inetsw :

1032 void inet_register_protosw(struct inet_protosw *p)
1033 {
...
1046         list_for_each(lh, &inetsw[p->type]) {
1047                 answer = list_entry(lh, struct inet_protosw, list);
1048                 /* Check only the non-wild match. */
1049                 if ((INET_PROTOSW_PERMANENT & answer->flags) == 0)
1050                         break;
1054         }
...
1062         list_add_rcu(&p->list, last_perm);


Appel de inet_register_protosw :

1735         for (q = inetsw_array; q < &inetsw_array[INETSW_ARRAY_LEN]; ++q)
1736                 inet_register_protosw(q);

http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L1735

Contenu de la variable inetsw_array :

994 static struct inet_protosw inetsw_array[] =
995 {
996         {
997                 .type =       SOCK_STREAM,
998                 .protocol =   IPPROTO_TCP,
...
1003         },

http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L994

Appel à listen

3177 int kernel_listen(struct socket *sock, int backlog)
3178 {
3179         return sock->ops->listen(sock, backlog);
3180 }

http://lxr.free-electrons.com/source/net/socket.c#L3177

Valeur du membre ops :

994 static struct inet_protosw inetsw_array[] =
995 {
996         {
997                 .type =       SOCK_STREAM,
998                 .protocol =   IPPROTO_TCP,
999                 .prot =       &tcp_prot,
1000                 .ops =        &inet_stream_ops,
1003         },

http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L994

Valeur sock->ops->listen :

900 const struct proto_ops inet_stream_ops = {
901         .family            = PF_INET,
...
911         .listen            = inet_listen,

http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L900

Définition de inet_listen:
191 /*
192  *      Move a socket into listening state.
193  */
194 int inet_listen(struct socket *sock, int backlog)
195 {
....
232                 err = inet_csk_listen_start(sk, backlog);

http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L191

736 int inet_csk_listen_start(struct sock *sk, int backlog)
737 {
...
753         if (!sk->sk_prot->get_port(sk, inet->inet_num)) {

http://lxr.free-electrons.com/source/net/ipv4/inet_connection_sock.c#L736

Valeur du membre sk_prot :

249 static int inet_create(struct net *net, struct socket *sock, int protocol,
250                        int kern)
251 {
...
269         list_for_each_entry_rcu(answer, &inetsw[sock->type], list) {
270
271                 err = 0;
272                 /* Check the non-wild match. */
273                 if (protocol == answer->protocol) {
274                         if (protocol != IPPROTO_IP)
275                                 break;
...
316         answer_prot = answer->prot;
...
323         sk = sk_alloc(net, PF_INET, GFP_KERNEL, answer_prot, kern);

http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L985

1389 struct sock *sk_alloc(struct net *net, int family, gfp_t priority,
1390                       struct proto *prot, int kern)
1391 {
1392         struct sock *sk;
...
1401                 sk->sk_prot = sk->sk_prot_creator = prot;
...
1413         return sk;

http://lxr.free-electrons.com/source/net/core/sock.c#L1389

Valeur du membre get_port :

2315 struct proto tcp_prot = {
2316         .name                   = "TCP",
...
2335         .get_port               = inet_csk_get_port,

http://lxr.free-electrons.com/source/net/ipv4/tcp_ipv4.c#L2315

90 /* Obtain a reference to a local port for the given sock,
 91  * if snum is zero it means select any available local port.
 92  */
 93 int inet_csk_get_port(struct sock *sk, unsigned short snum)

http://lxr.free-electrons.com/source/net/ipv4/inet_connection_sock.c#L90

Vous avez suivi?
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: corrector le 27 mars 2016 à 11:04:42
Pour connect sur socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) :

994 static struct inet_protosw inetsw_array[] =
995 {
996         {
997                 .type =       SOCK_STREAM,
998                 .protocol =   IPPROTO_TCP,
999                 .prot =       &tcp_prot,
1000                 .ops =        &inet_stream_ops,
1003         },

http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L994

900 const struct proto_ops inet_stream_ops = {
901         .family            = PF_INET,
...
905         .connect           = inet_stream_connect,

http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L900

651 int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
652                         int addr_len, int flags)
653 {
...
657         err = __inet_stream_connect(sock, uaddr, addr_len, flags);

http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L651

560 /*
561  *      Connect to a remote host. There is regrettably still a little
562  *      TCP 'magic' in here.
563  */
564 int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
565                           int addr_len, int flags)
566 {
...
580         switch (sock->state) {
....
591         case SS_UNCONNECTED:
...
596                 err = sk->sk_prot->connect(sk, uaddr, addr_len);

http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L560

2315 struct proto tcp_prot = {
2316         .name                   = "TCP",
...
2319         .connect                = tcp_v4_connect,

http://lxr.free-electrons.com/source/net/ipv4/tcp_ipv4.c#L2315

139 /* This will initiate an outgoing connection. */
140 int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
141 {
142         struct sockaddr_in *usin = (struct sockaddr_in *)uaddr;
143         struct inet_sock *inet = inet_sk(sk);
144         struct tcp_sock *tp = tcp_sk(sk);
145         __be16 orig_sport, orig_dport;
146         __be32 daddr, nexthop;
147         struct flowi4 *fl4;
148         struct rtable *rt;
...
167         orig_sport = inet->inet_sport;
168         orig_dport = usin->sin_port;
169         fl4 = &inet->cork.fl.u.ip4;
170         rt = ip_route_connect(fl4, nexthop, inet->inet_saddr,
171                               RT_CONN_FLAGS(sk), sk->sk_bound_dev_if,
172                               IPPROTO_TCP,
173                               orig_sport, orig_dport, sk);
...
226         rt = ip_route_newports(fl4, rt, orig_sport, orig_dport,
227                                inet->inet_sport, inet->inet_dport, sk);
...
245         err = tcp_connect(sk);

http://lxr.free-electrons.com/source/net/ipv4/tcp_ipv4.c#L139

273 static inline struct rtable *ip_route_connect(struct flowi4 *fl4,
274                                               __be32 dst, __be32 src, u32 tos,
275                                               int oif, u8 protocol,
276                                               __be16 sport, __be16 dport,
277                                               struct sock *sk)
278 {
279         struct net *net = sock_net(sk);
280         struct rtable *rt;
281
282         ip_route_connect_init(fl4, dst, src, tos, oif, protocol,
283                               sport, dport, sk);
284
285         if (!src && oif) {
286                 int rc;
287
288                 rc = l3mdev_get_saddr(net, oif, fl4);
289                 if (rc < 0)
290                         return ERR_PTR(rc);
291
292                 src = fl4->saddr;
293         }
294         if (!dst || !src) {
295                 rt = __ip_route_output_key(net, fl4);
296                 if (IS_ERR(rt))
297                         return rt;
298                 ip_rt_put(rt);
299                 flowi4_update_output(fl4, oif, tos, fl4->daddr, fl4->saddr);
300         }
301         security_sk_classify_flow(sk, flowi4_to_flowi(fl4));
302         return ip_route_output_flow(net, fl4, sk);
303 }
304
305 static inline struct rtable *ip_route_newports(struct flowi4 *fl4, struct rtable *rt,
306                                                __be16 orig_sport, __be16 orig_dport,
307                                                __be16 sport, __be16 dport,
308                                                struct sock *sk)
309 {
310         if (sport != orig_sport || dport != orig_dport) {
311                 fl4->fl4_dport = dport;
312                 fl4->fl4_sport = sport;
313                 ip_rt_put(rt);
314                 flowi4_update_output(fl4, sk->sk_bound_dev_if,
315                                      RT_CONN_FLAGS(sk), fl4->daddr,
316                                      fl4->saddr);
317                 security_sk_classify_flow(sk, flowi4_to_flowi(fl4));
318                 return ip_route_output_flow(sock_net(sk), fl4, sk);
319         }
320         return rt;
321 }

http://lxr.free-electrons.com/source/include/net/route.h#L273

Je ne vois rien ici qui contraigne la valeur du port destination.
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: corrector le 27 mars 2016 à 12:26:17
Dans Linux, le port n'est pas utilisable par bind() :
Si, il l'est :
422 int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
423 {
424         struct sockaddr_in *addr = (struct sockaddr_in *)uaddr;
425         struct sock *sk = sock->sk;
426         struct inet_sock *inet = inet_sk(sk);
427         struct net *net = sock_net(sk);
428         unsigned short snum;
429         int chk_addr_ret;
430         u32 tb_id = RT_TABLE_LOCAL;
431         int err;
432
433         /* If the socket has its own bind function then use it. (RAW) */
434         if (sk->sk_prot->bind) {
435                 err = sk->sk_prot->bind(sk, uaddr, addr_len);
436                 goto out;
437         }
...
495         /* Make sure we are allowed to bind here. */
496         if ((snum || !inet->bind_address_no_port) &&
497             sk->sk_prot->get_port(sk, snum))

http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L422

static int do_ip_setsockopt(struct sock *sk, int level,
             int optname, char __user *optval, unsigned int optlen)
{
...
   case IP_BIND_ADDRESS_NO_PORT:
      inet->bind_address_no_port = val ? 1 : 0;
      break;

http://lxr.free-electrons.com/source/net/ipv4/ip_sockglue.c

Donc oui tu peux appeler bind avec un port 0 avec la bonne option, mais non, ça ne sert à rien, comme j'ai montré avec listen.
Titre: TCP/UDP : Le port 0 existe-t-il ?
Posté par: corrector le 27 mars 2016 à 13:03:49
J'ai oublié ça :

139 /* This will initiate an outgoing connection. */
140 int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
141 {
...
220         err = inet_hash_connect(&tcp_death_row, sk);

http://lxr.free-electrons.com/source/net/ipv4/tcp_ipv4.c#L139

611 /*
612  * Bind a port for a connect operation and hash it.
613  */
614 int inet_hash_connect(struct inet_timewait_death_row *death_row,
615                       struct sock *sk)
616 {
617         u32 port_offset = 0;
618
619         if (!inet_sk(sk)->inet_num)
620                 port_offset = inet_sk_port_offset(sk);
621         return __inet_hash_connect(death_row, sk, port_offset,
622                                    __inet_check_established);
623 }

http://lxr.free-electrons.com/source/net/ipv4/inet_hashtables.c#L611

503 int __inet_hash_connect(struct inet_timewait_death_row *death_row,
504                 struct sock *sk, u32 port_offset,
505                 int (*check_established)(struct inet_timewait_death_row *,
506                         struct sock *, __u16, struct inet_timewait_sock **))
507 {
...
515         if (!snum) {

http://lxr.free-electrons.com/source/net/ipv4/inet_hashtables.c#L503