IP地址如何从应用层转到IP层?

使用传统的TCP / IP层模型,我正在考虑一个应用程序(例如一个浏览器)作为一个客户端,想与服务器(如Web服务器)交谈。 当然,它必须使用服务器的IP地址来定位Internet上的服务器主机。 所以我的应用程序层进程(浏览器)知道目的地的IP地址(例如,它从DNS查询接收它)。

为了处理这个请求,浏览器把它传递给传输层,更准确地说是传给TCP进程。 我的问题是,在TCP段没有IP地址字段,既不是目的地,也不是源。 传输层进程使用端口作为解决源和目标的方法。 当段被传递到底层并成为一个IP包时,这里的IP地址(包括目的地和源地址)都会再次返回。 这似乎神奇!

这个IP消失并重新出现在下面的两层正是我想了解的。 是否有某种types的层结构的违反,允许这个信息渗透到TCP层? 或者我不是很了解一些非常重要的东西?

你想象中的复杂简单的事情。

每一层都被封装在下面的图层中,所以当你的浏览器使用TCP套接字时,实际上它也会使用TCP下面的所有层,剩下的堆栈通常只是被抽象给程序员。

如果你喜欢冒险,你仍然可以使用原始套接字来构build一个程序,并自己操作从第2层到第7层的整个堆栈。 例如,数据包嗅探/注入程序使用这种套接字来根据传递给程序的选项来logging/修改所需层中的足够的字段。

例如,使用packit,你可以改变源/目的地MAC地址等第 2层字段,以便在networking中进行一些实验(例如,通过在第4层使用UDP协议发送数据时,欺骗其他主机的MAC地址以获得MAC地址过滤)。