首页 > 其他分享 >关于网络协议的若干问题(三)

关于网络协议的若干问题(三)

时间:2023-10-12 23:32:35浏览次数:34  
标签:IP 报文 网络协议 TCP BGP 关于 ICMP 连接 若干

1、当发送的报文出问题的时候,会发送一个 ICMP 的差错报文来报告错误,但是如果 ICMP 的差错报文也出问题了呢?

答:不会导致产生 ICMP 差错报文的有:

  • ICMP 差错报文(ICMP 查询报文可能会产生 ICMP 差错报文);
  • 目的地址是广播地址或多播地址的 IP 数据报;
  • 作为链路层广播的数据报;
  • 不是 IP 分片的第一片;
  • 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。

2、ping 使用的是什么网络编程接口?

答:网络编程接口是 Socket,对于 ping 来讲,使用的是 ICMP,创建 Socket 如下:

socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)

SOCK_RAW 就是基于 IP 层协议建立通信机制。

如果是 TCP,则建立下面的 Socket:

socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

如果是 UDP,则建立下面的 Socket:

socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)

3、ICMP 差错报文是谁发送的呢?

答:ICMP 包是由内核返回的,在内核中,有一个函数用于发送 ICMP 的包。

void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info);

例如,目标不可达,会调用下面的函数。

icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PROT_UNREACH, 0);

当 IP 大小超过 MTU 的时候,发送需要分片的 ICMP。

if (ip_exceeds_mtu(skb, mtu)) {
  icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
  goto drop;
 }

4、NAT 能建立多少连接?

答:SNAT 多用于内网访问外网的场景,鉴于 conntrack 是由{源 IP,源端口,目标 IP,目标端口},hash 后确定的。

如果内网机器很多,但是访问的是不同的外网,也即目标 IP 和目标端口很多,这样内网可承载的数量就非常大,可不止 65535 个。

但是如果内网所有的机器,都一定要访问同一个目标 IP 和目标端口,这样源 IP 如果只有一个,这样的情况下,才受 65535 的端口数目限制,根据原理,一种方法就是多个源 IP,另外的方法就是多个 NAT 网关,来分摊不同的内网机器访问。

如果你使用的是公有云,65535 台机器,应该放在一个 VPC 里面,可以放在多个 VPC 里面,每个 VPC 都可以有自己的 NAT 网关。

5、公网 IP 和私网 IP 需要一一绑定吗?

答:公网 IP 是有限的,如果使用公有云,需要花钱去买。但是不是每一个虚拟机都要有一个公网 IP 的,只有需要对外提供服务的机器,也即接入层的那些 nginx 需要公网 IP,没有公网 IP,使用 SNAT,大家共享 SNAT 网关的公网 IP 地址,也是能够访问的外网的。

6、路由协议要在路由器之间交换信息,这些信息的交换还需要走路由吗?不是死锁了吗?

答:OSPF 是直接基于 IP 协议发送的,而且 OSPF 的包都是发给邻居的,也即只有一跳,不会中间经过路由设备。BGP 是基于 TCP 协议的,在 BGP peer 之间交换信息。

7、多线 BGP 机房是怎么回事儿?

答:BGP 主要用于互联网 AS 自治系统之间的互联,BGP 的最主要功能在于控制路由的传播和选择最好的路由。各大运营商都具有 AS 号,全国各大网络运营商多数都是通过 BGP 协议与自身的 AS 来实现多线互联的。

使用此方案来实现多线路互联,IDC 需要在 CNNIC(中国互联网信息中心)或 APNIC(亚太网络信息中心)申请自己的 IP 地址段和 AS 号,然后通过 BGP 协议将此段 IP 地址广播到其它的网络运营商的网络中。

使用 BGP 协议互联后,网络运营商的所有骨干路由设备将会判断到 IDC 机房 IP 段的最佳路由,以保证不同网络运营商用户的高速访问。

8、TCP 的连接有这么多的状态,你知道如何在系统中查看某个连接的状态吗?

答:可以使用netstat或者lsof命令grep一下establish listen close_wait等来查看。

9、TIME_WAIT 状态太多是怎么回事儿?

答:如果处于 TIMEWAIT 状态,说明双方建立成功过连接,而且已经发送了最后的 ACK 之后,才会处于这个状态,而且是主动发起关闭的一方处于这个状态。

关于网络协议的若干问题(三)_网络协议

如果存在大量的 TIMEWAIT,往往是因为短连接太多,不断的创建连接,然后释放连接,从而导致很多连接在这个状态,可能会导致无法发起新的连接。解决的方式往往是:

  • 打开 tcp_tw_recycle 和 tcp_timestamps 选项;
  • 打开 tcp_tw_reuse 和 tcp_timestamps 选项;
  • 程序中使用 SO_LINGER,应用强制使用 rst 关闭。

当客户端收到 Connection Reset,往往是收到了 TCP 的 RST 消息,RST 消息一般在下面的情况下发送:

  • 试图连接一个未被监听的服务端;
  • 对方处于 TIMEWAIT 状态,或者连接已经关闭处于 CLOSED 状态,或者重新监听 seq num 不匹配;
  • 发起连接时超时,重传超时,keepalive 超时;
  • 在程序中使用 SO_LINGER,关闭连接时,放弃缓存中的数据,给对方发送 RST。

10、起始序列号是怎么计算的,会冲突吗?

答:起始 ISN 是基于时钟的,每 4 毫秒加一,转一圈要 4.55 个小时。

TCP 初始化序列号不能设置为一个固定值,因为这样容易被入侵者猜出后续序列号,从而遭到入侵。 RFC1948 中提出了一个较好的初始化序列号 ISN 随机生成算法。

ISN = M + F (localhost, localport, remotehost, remoteport)

M 是一个计时器,这个计时器每隔 4 毫秒加 1。F 是一个 Hash 算法,根据源 IP、目的 IP、源端口、目的端口生成一个随机数值。要保证 Hash 算法不能被外部轻易推算得出,用 MD5 算法是一个比较好的选择。

11、epoll 是 Linux 上的函数,那你知道 Windows 上对应的机制是什么吗?如果想实现一个跨平台的程序,你知道应该怎么办吗?

答:epoll 是异步通知,当事件发生的时候,通知应用去调用 IO 函数获取数据。IOCP 异步传输,当事件发生时,IOCP 机制会将数据直接拷贝到缓冲区里,应用可以直接使用。

如果跨平台,推荐使用 libevent 库,它是一个事件通知库,适用于 Windows、Linux、BSD 等多种平台,内部使用 select、epoll、kqueue、IOCP 等系统调用管理事件机制。

12、ping是如何nat的呢?

答:通过 nf_conntrack_tuple 里面的内容,可以唯一地标识一个连接:

src:包含源 IP 地址;如果是 TCP 或者 UDP,包含源端口;如果是 ICMP,包含的是 ID;

dst:包含目标 IP 地址;如果是 TCP 或者 UDP,包含目标端口;如果是 ICMP,包含的是 type, code。


标签:IP,报文,网络协议,TCP,BGP,关于,ICMP,连接,若干
From: https://blog.51cto.com/key3feng/7836244

相关文章

  • 2023.10.12python练习关于函数
    #让20以内的奇数写入函数里然后输出三遍defnumber():a=-1whilea<19:a+=2print(a,end="")b=1whileb<=3:b+=1number()print()#输出5次20以内的奇数并输出5次9*9乘法表,都写入一个函数里defwww():x,y=1,1z=......
  • 关于如何解决visualc++6.0打开文件闪退的一种方式(附带解决输入法无法显示)
    这里我把VisualC++6.0安装程序和filetool分享在我的网盘里面了网盘下载QAQ链接:https://pan.baidu.com/s/1azSMX_cOKgb64WT7-gTdbQ?pwd=ayxs提取码:ayxs 下载后解压文件,运行filetool.exe 进入Visualc++6.0,我们要运行并打开这个filetool里的工作空间  然后单击工......
  • 关于 C# / .Net / IIS Web Service 调用 exe
    转自:https://blog.csdn.net/sby5104/article/details/110189048最近一个面试,面试官说他们现在的架构是通过IIS部署的WebService调用Server端的WindowsApplication也就是exe。面试拉跨之后自己尝试了一下这种实现方式,在这里记录一下自己遇到的坑,然后留一下查到的解决方案。......
  • 关于MIPS
    MIPS有32个通用寄存器($0-$31),各寄存器的功能及汇编程序中使用约定如下:下表描述32个通用寄存器的别名和用途:REGISTERNAMEUSAGE$0$zero常量0(constantvalue0)$1$at保留给汇编器(Reservedforassembler)$2-$3$v0-$v1函数调用返回值(v......
  • 关于c语言操作libwebsockets示例
    第一步,安装libwebsockets库,c语言编写的,默认安装引用库,配置相应的库及路径第二步:上代码main.h ////CreatedbyAdministratoron2020/5/1.// #ifndefMEDIA_MAIN_H#defineMEDIA_MAIN_H #define boolchar volatileintexit_sig=0; #defineMAX_PAYLOAD_SIZE 10......
  • 关于CAN工作模式的切换以及CAN2的使用
    1、关于CAN工作模式的切换CH32的CAN有3种工作模式:初始化模式、睡眠模式和正常模式3种模式。只能在初始化模式下修改CAN_BTIMR的SILM和LBKM位配置来选择一种测试模式,测试模式有3种:静默模式,环回模式,静默环回模式。若要切换工作模式,需要对寄存器CAN_CTLR中的SLEEP或INRQ位......
  • 关于绩效
    记得上次升岗是在2014年6月低收到的文件,可能人力大姐给忘记了,到年底11月调动时候在领导过问下才在系统调整。十年后的今天,岗位依旧是2014年的级别。回想去年疫情期间肩上扛着好几个考核指标,封闭在家,半夜小孩睡了才起来加班到四五点,白天八点半开始不停的电话、视频会议……,所幸......
  • 2023/10/12 关于创业公司的战略路线
    早期:产品:这个阶段的重点是找到一个切实可行的产品或服务。这可能需要进行大量的市场调研和用户访谈,以了解用户的需求。此外,还需要进行快速迭代,根据用户反馈不断优化产品。市场:早期阶段的另一个重要任务是确定目标市场。这需要对市场进行深入的研究,了解竞争对手,确定自己的定位。......
  • 关于vscode编写qt,qdebug无法输出到终端的问题
    这个问题主要是cmake那边的qt设置没弄好。其中WIN32_EXECUTABLEON。这个选项要设置为OFF。不然qdebug无法打印到终端中。如果本来就没有这set_target_properties的话,可以在cmake最后一行加上这个,并且将WIN32_EXECUTABLEON设置为OFF即可。set_target_properties(appl......
  • 关于网络协议的若干问题(二)
    1、网络号、IP地址、子网掩码和广播地址的先后关系是什么?答:当在一个数据中心或者一个办公室规划一个网络的时候,首先是网络管理员规划网段,一般是根据将来要容纳的机器数量来规划,一旦定了,以后就不好变了。假如你在一个小公司里,总共就没几台机器,对于私有地址,一般选择192.168.0.0/24......