网络的一些技术积累

早年IPv4的资源不够,所以有了NAT,也即允许局域网IP。NAT一般分为4种,手机上网采用的是Symmetric NAT,这种比较讨厌,内网到外网的映射关系总是改变,导致外网电脑无法根据映射的外网IP和端口主动访问内网电脑(只能被动响应),这就是采用无线网卡上网的单板,没法被网管主动发现的原因。我们申请的外网IP,也是在NAT里的,属于Restric NAT。这种比较友善,对外总是一个不变的IP,这样外网电脑就能通过这个外网IP访问它的服务器了。我们公司的普通内网环境,是非常严的,除了上网的80端口,其他全部封死,也就是说,就算你主动发起对外的连接,外网的电脑也无法回包给你。所以,公司内网是肯定做不了对外的服务器的。 


NAT给工程师带来N多麻烦后,ITEF马上弄了几个协议来补救,包括STUN和TURN协议。STUN简单的说就是替换你应用层里的私网IP为公网IP(通过外网的STUN服务器获知),但无法解决移动网络的对称性NAT的穿越(因为映射IP老是变)。TURN采用中继的方式,就是外网加入一个TURN服务器,两边的通信通过TURN服务器周转,这种方式可以解决对称性NAT的通信问题。也就是说,如果单板采用移动网络上网,且网管采用如SNMP与单板通信,是必须使用TURN服务器的(网管需要主动轮询单板,如果单板全是主动上报,则不需要)


网络上经常出现的如,192.168.1.110/24,这个24指的是子网掩码的个数,即24个二进制1,也即255.255.255.0的意思.


如果tcp通信采用长连接方式,为了知道网络对端是否dead,最佳的方式是使用tcp自带的keepalive包。这个机制是tcp本身就有的,属于链路层的探测。一个keepalive包由于内容为空,因此,大小为60字节而已。那种采用应用层发送心跳包来探测对端的方式,完全是多此一举,而且应用层的心跳包一定大于内容为空的keepalive包,不仅重复开发,而且浪费带宽。tcp默认没有打开,可以在socket参数中设置打开。cd 到/proc/sys/net/ipv4 ,cat tcp_keepalive_time,tcp_keepalive_intvl,tcp_keepalive_probes,一般默认值为7200,75和9,意思是7200秒周期探测对端,如果对方不回包,75秒后重发,如果连续9次不回包,则告诉应用层对方挂了。就这么简单。 


wireshark在监控协议数据时,有时可以识别snmp,有时则只能显示udp,为什么呢?其实wireshark的算法很粗暴,不是分析协议的特征来告诉你是否snmp,而是根据端口号。如果是发送到161和162接收到的udp包,则认为是snmp协议,换一个端口,就只能显示udp了。


NFS虽然方便,但是跨linux和win时,utf-8与gbk的编码问题很讨厌,win7下看ubuntu里的中文,全是乱码。采用samba方式后,就没有这个乱码问题了。ubuntu用图形界面配置好samba后,win7用net use s: \\ip\folder_name就可以映射到s的盘符里了,比较方便。


一般而言,链路层的包叫frame,网络层的包叫packet,传输层的包叫segment.我们的通讯代码中,对“包”的命名,是多少有些不规范的。 

猜你喜欢

转载自blog.csdn.net/yyw794/article/details/78114345
今日推荐