Network之解惑(1)

本文深入探讨网络数据传输机制,详细解析TCP/IP协议如何确保数据安全可靠地在网络中流动,并解释了局域网内与外部服务器间通信的实现方式,特别是通过NAT技术解决内网与外网间的数据交换问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Network解惑(1)



  1. 概述

一直以来,对网络传输,都有个疑惑。即网络传输到底是什么样的,能不能在外部直接访问局域网内部服务器。带着这份疑惑,开始了本文

这里的解惑,是解自己的惑,大神请直接无视,或者批评

关于网络结构,网上有很多,标准的7层结构等等。在windows内部,一般认为可以按照四层划分。本屌按照实践的路线,不做任何无关理论的东西阐述,仅仅是解惑的流程

在windows的网络数据流,大概如下(后面的硬件层,已经和windows无关了)

应用ws2_32.dllLSPafd.systcpip.sysNDIS中间小端口路由器(交换机)

数据回来的路线,就是线路的逆向

  1. 正文(开始乱扯)

作为最常用的协议,就从tcp/ip协议来说吧。

Tcp和ip,其实是两个协议,后面的文章会细说。

一个典型的http包的层次(走的是tcp/ip协议,忽略建立连接的过程)

1、浏览器(或其他应用),封装http格式的包,下发

2、tcp协议,封装tcp包,包内包含端口信息,下发

3、ip协议,封装ip包, 包括源地址和目的地址(ip地址,没有端口),下发

4、链路层包,封装链路层包,一般也叫以太包。到了这个层次,已经没有ip的概念了,只有硬件的地址,即mac地址,供网卡,路由器等在物理线路上传输。


要连接一个服务器,需要一个ip地址和端口,ip地址干什么的,无需多说,那个端口干什么的呢?

其实到了ip封包时,已经没有了端口的概念。可以这么想一下,如果本机有多个应用同时使用网络,当有数据回来的时候,数据应该传递给那个应用呢?好吧,其实这个基本就是端口的作用了。端口可以用来区分一个连接。说是端口,其实是虚的,不会真实的存在一个硬件端口,从程序的角度来说,其实就是一个unsigned short,能表示的范围为0~65535,所以一个机器上,也只可能有65535个端口(好多已经固定了,比如20等端口,一般最好使用大于10000的端口,以免和别的连接冲突)许多防火墙等工具提供的打开关闭端口的功能,其实就是一个tcp,udp等包,是否丢弃。

到这里,在tcp/ip这一层,已经完全明白数据的流向了。其实,tcp/ip最重要的,是安全,就是数据收发是可靠的,不属于本文,以后文章会讲。


现在到了最关键的环节了,以太包。

Ethernet 2协议。

到了这里,只和链路层有关系了,到这里,什么http啊,ip啊,端口啊等等之类的,已经没有了概念。是不是很像什么,对,就像快递一样。客户把要邮寄的东西包装好,交给快递,快递公司不需要管包里到底是什么东西,只是负责把包裹送到指定的地址,具体包里是什么东西,怎么使用,那是客户已经商量好的。

当然,这只是一个粗略的形容,不是特别恰当。

和快递公司,有自己的中转站一样,在网络里,这个中转站,就是路由器(交换机)。


好了,现在回到问题开头。我们知道,如果在内网里面,访问外网的服务器,因为这个服务器的ip地址已经确定了,通过重重路由,最终可以把数据送到。但是数据回来呢,数据是如何回来的?访问一个页面,请求数据发出,到达服务器,服务器返回数据,回到客户端,确实是可以的,但是是怎么实现的呢?

现在引入一个NAT的概念。NAT全名叫Network Address Translation,网络地址翻译。

首先一个问题,为什么要翻译?

世界上,有很多很多内部网络,他们的ip地址(参考ip地址划分,子网等)只在内部有效,到了外部,基本没有的意义。比如,有两个不同的局域网,内部的两台机器的IP可能都是10.3.42.2。这个时候,是路由器显身手的时候了。

首先,路由器本身有一个或者多个地址(ip地址和mac地址),且这个ip地址是可以访问整个internet的,所有内部机器访问外网的时候,都是通过这个ip地址。

内部机器的网络数据到达路由器的时候,路由器网络数据发送到服务器。且在建立连接的时候,路由器会把这种对应关系保存,修改ip包,把里面的源ip地址(内网),改成路由器的ip地址。这样,服务器返回的数据,能顺利到达路由器,路由器在通过建立连接时候的对应关系,找到对应的内部机器,把数据送到内部机器。其实,在路由器内部保存的有内部机器的ip地址和mac地址对应关系的,发送数据的时候,用的是mac地址(参考Ethernet 2封包)。这个过程,大致就是nat的工作原理


好了,现在问题回到开头。即外部服务器,是否可以直接访问局域网内部机器?

很遗憾,答案是不能。首先,服务器,不知道路由器的地址,即便知道,数据发给路由器的时候,路由器也不知道把该数据发送给内部的哪台机器。


往往事情没有绝对的,现在基本所有的路由器都支持端口映射的功能,通过该功能,即可以实现外网访问内网。

原理,就是在路由器上建立一组规则,比如,所有发送到路由器80端口(web服务器)的数据,全部转发到内部的一台机器,这样,外部网络通过访问路由器的ip地址+80端口,即可访问内部的web服务器了。


自此,可以回答开头的那个问题了,可以。但是,这些全部都是路由器来实现的



参考资料:

1、<< tcp/ip详解 >>

2<< Windows内核原理与实现>>

3、http://www.google.com/patents/CN1567907A?cl=zh


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值