Efectivamente, en el stack TCP/IP la separación de capas no es perfecta. En cierto sentido TCP y UDP no pueden ser pensados de forma independiente de IP, porque reusan sus direcciones como parte de las suyas propias. Por eso capa 4 depende de la colaboración de la capa 3.
En el ejemplo UDP, la capa 3 de red luego de procesar el cabezal IP le pasa el payload (el datagrama UDP) a la capa 4 de transporte, y además le pasa las direcciones IP que extrajo. Luego la capa 4 extrae los puertos y el payload de transporte; luego coloca en el socket correspondiente la IP origen (que le paso la capa 3), el puerto origen y el payload que extrajo.
En el ejemplo UDP, la capa 3 de red luego de procesar el cabezal IP le pasa el payload (el datagrama UDP) a la capa 4 de transporte, y además le pasa las direcciones IP que extrajo. Luego la capa 4 extrae los puertos y el payload de transporte; luego coloca en el socket correspondiente la IP origen (que le paso la capa 3), el puerto origen y el payload que extrajo.