51CTO首页
AI.x社区
博客
学堂
精品班
免费课
企业培训
鸿蒙开发者社区
WOT技术大会
AIGC创新中国行
IT证书
公众号矩阵
移动端

字节一面:TCP 和 UDP 可以使用同一个端口吗?

网络 通信技术
在数据链路层中,通过 MAC 地址来寻找局域网中的主机。在网际层中,通过 IP 地址来寻找网络中互连的主机或路由器。在传输层中,需要通过端口进行寻址,来识别同一计算机中同时通信的不同应用程序。

大家好,我是小林。

之前有读者在字节面试的时候,被问到:TCP 和 UDP 可以同时监听相同的端口吗?

图片

关于端口的知识点,还是挺多可以讲的,比如还可以牵扯到这几个问题:

  • 多个 TCP 服务进程可以同时绑定同一个端口吗?
  • 客户端的端口可以重复使用吗?
  • 客户端 TCP 连接 TIME_WAIT 状态过多,会导致端口资源耗尽而无法建立新的连接吗?

所以,这次就跟大家盘一盘这些问题。

TCP 和 UDP 可以同时绑定相同的端口吗?

其实我感觉这个问题「TCP 和 UDP 可以同时监听相同的端口吗?」表述有问题,这个问题应该表述成「TCP 和 UDP 可以同时绑定相同的端口吗?」

因为「监听」这个动作是在 TCP 服务端网络编程中才具有的,而 UDP 服务端网络编程中是没有「监听」这个动作的。

TCP 和 UDP 服务端网络相似的一个地方,就是会调用 bind 绑定端口。

给大家贴一下  TCP 和 UDP 网络编程的区别就知道了。

TCP 网络编程如下,服务端执行 listen() 系统调用就是监听端口的动作。

图片

TCP 网络编程

UDP 网络编程如下,服务端是没有监听这个动作的,只有执行  bind()  系统调用来绑定端口的动作。

图片

UDP 网络编程

TCP 和 UDP 可以同时绑定相同的端口吗?

答案:可以的。

在数据链路层中,通过 MAC 地址来寻找局域网中的主机。在网际层中,通过 IP 地址来寻找网络中互连的主机或路由器。在传输层中,需要通过端口进行寻址,来识别同一计算机中同时通信的不同应用程序。

所以,传输层的「端口号」的作用,是为了区分同一个主机上不同应用程序的数据包。

传输层有两个传输协议分别是 TCP 和 UDP,在内核中是两个完全独立的软件模块。

当主机收到数据包后,可以在 IP 包头的「协议号」字段知道该数据包是 TCP/UDP,所以可以根据这个信息确定送给哪个模块(TCP/UDP)处理,送给 TCP/UDP 模块的报文根据「端口号」确定送给哪个应用程序处理。

图片

因此, TCP/UDP 各自的端口号也相互独立,如 TCP 有一个 80 号端口,UDP 也可以有一个 80 号端口,二者并不冲突。

验证结果

我简单写了 TCP 和 UDP 服务端的程序,它们都绑定同一个端口号 8888。

图片

运行这两个程序后,通过 netstat 命令可以看到,TCP 和 UDP 是可以同时绑定同一个端口号的。

图片

多个 TCP 服务进程可以绑定同一个端口吗?

还是以前面的 TCP 服务端程序作为例子,启动两个同时绑定同一个端口的 TCP 服务进程。

运行第一个  TCP 服务进程之后,netstat 命令可以查看,8888 端口已经被一个 TCP 服务进程绑定并监听了,如下图:

图片

接着,运行第二个 TCP 服务进程的时候,就报错了“Address already in use”,如下图:

图片

我上面的测试案例是两个 TCP 服务进程同时绑定地址和端口是:0.0.0.0 地址和8888端口,所以才出现的错误。

如果两个 TCP 服务进程绑定的 IP 地址不同,而端口相同的话,也是可以绑定成功的,如下图:

图片

所以,默认情况下,针对「多个 TCP 服务进程可以绑定同一个端口吗?」这个问题的答案是:如果两个 TCP 服务进程同时绑定的 IP 地址和端口都相同,那么执行 bind() 时候就会出错,错误是“Address already in use”。

注意,如果 TCP 服务进程 A 绑定的地址是  0.0.0.0 和端口 8888,而如果 TCP 服务进程 B 绑定的地址是 192.168.1.100 地址(或者其他地址)和端口 8888,那么执行 bind() 时候也会出错。

这是因为 0.0.0.0  地址比较特殊,代表任意地址,意味着绑定了 0.0.0.0  地址,相当于把主机上的所有 IP 地址都绑定了。

重启 TCP 服务进程时,为什么会有“Address in use”的报错信息?

TCP 服务进程需要绑定一个 IP 地址和一个端口,然后就监听在这个地址和端口上,等待客户端连接的到来。

然后在实践中,我们可能会经常碰到一个问题,当 TCP 服务进程重启之后,总是碰到“Address in use”的报错信息,TCP 服务进程不能很快地重启,而是要过一会才能重启成功。

这是为什么呢?

当我们重启 TCP 服务进程的时候,意味着通过服务器端发起了关闭连接操作,于是就会经过四次挥手,而对于主动关闭方,会在 TIME_WAIT 这个状态里停留一段时间,这个时间大约为 2MSL。

图片

当 TCP 服务进程重启时,服务端会出现 TIME_WAIT 状态的连接,TIME_WAIT 状态的连接使用的 IP+PORT 仍然被认为是一个有效的 IP+PORT 组合,相同机器上不能够在该 IP+PORT 组合上进行绑定,那么执行 bind() 函数的时候,就会返回了 Address already in use 的错误。

而等 TIME_WAIT 状态的连接结束后,重启 TCP 服务进程就能成功。

重启 TCP 服务进程时,如何避免“Address in use”的报错信息?

我们可以在调用 bind 前,对 socket 设置 SO_REUSEADDR 属性,可以解决这个问题。

int on = 1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

因为  SO_REUSEADDR 作用是:如果当前启动进程绑定的 IP+PORT 与处于TIME_WAIT 状态的连接占用的 IP+PORT 存在冲突,但是新启动的进程使用了 SO_REUSEADDR 选项,那么该进程就可以绑定成功。

举个例子,服务端有个监听 0.0.0.0 地址和 8888 端口的 TCP 服务进程。‍

图片

有个客户端(IP地址:192.168.1.100)已经和服务端(IP 地址:172.19.11.200)建立了 TCP 连接,那么在 TCP 服务进程重启时,服务端会与客户端经历四次挥手,服务端的 TCP 连接会短暂处于 TIME_WAIT 状态:

客户端地址:端口           服务端地址:端口        TCP 连接状态
192.168.1.100:37272 172.19.11.200:8888 TIME_WAIT

如果 TCP 服务进程没有对 socket 设置 SO_REUSEADDR 属性,那么在重启时,由于存在一个和绑定 IP+PORT 一样的 TIME_WAIT 状态的连接,那么在执行 bind() 函数的时候,就会返回了 Address already in use 的错误。

如果 TCP 服务进程对 socket 设置 SO_REUSEADDR 属性了,那么在重启时,即使存在一个和绑定 IP+PORT 一样的 TIME_WAIT 状态的连接,依然可以正常绑定成功,因此可以正常重启成功。

因此,在所有 TCP 服务器程序中,调用 bind 之前最好对 socket 设置 SO_REUSEADDR 属性,这不会产生危害,相反,它会帮助我们在很快时间内重启服务端程序。‍

前面我提到过这个问题:如果 TCP 服务进程 A 绑定的地址是  0.0.0.0 和端口 8888,而如果 TCP 服务进程 B 绑定的地址是 192.168.1.100 地址(或者其他地址)和端口 8888,那么执行 bind() 时候也会出错。

这个问题也可以由 SO_REUSEADDR 解决,因为它的另外一个作用是:绑定的 IP地址 + 端口时,只要 IP 地址不是正好(exactly)相同,那么允许绑定。​

比如,0.0.0.0:8888 和192.168.1.100:8888,虽然逻辑意义上前者包含了后者,但是 0.0.0.0 泛指所有本地 IP,而 192.168.1.100 特指某一IP,两者并不是完全相同,所以在对 socket 设置 SO_REUSEADDR 属性后,那么执行 bind() 时候就会绑定成功。

客户端的端口可以重复使用吗?

客户端在执行 connect 函数的时候,会在内核里随机选择一个端口,然后向服务端发起 SYN 报文,然后与服务端进行三次握手。

图片

所以,客户端的端口选择的发生在 connect 函数,内核在选择端口的时候,会从 net.ipv4.ip_local_port_range 这个内核参数指定的范围来选取一个端口作为客户端端口。

该参数的默认值是 32768 61000,意味着端口总可用的数量是 61000 - 32768 = 28232 个。

当客户端与服务端完成 TCP 连接建立后,我们可以通过 netstat 命令查看 TCP 连接。

$ netstat -napt
协议 源ip地址:端口 目的ip地址:端口 状态
tcp 192.168.110.182.64992 117.147.199.51.443 ESTABLISHED

那问题来了,上面客户端已经用了 64992 端口,那么还可以继续使用该端口发起连接吗?

这个问题,很多同学都会说不可以继续使用该端口了,如果按这个理解的话, 默认情况下客户端可以选择的端口是 28232 个,那么意味着客户端只能最多建立  28232 个 TCP 连接,如果真是这样的话,那么这个客户端并发连接也太少了吧,所以这是错误理解。

正确的理解是,TCP 连接是由四元组(源IP地址,源端口,目的IP地址,目的端口)唯一确认的,那么只要四元组中其中一个元素发生了变化,那么就表示不同的 TCP 连接的。所以如果客户端已使用端口 64992 与服务端 A 建立了连接,那么客户端要与服务端 B 建立连接,还是可以使用端口 64992 的,因为内核是通过四元祖信息来定位一个 TCP 连接的,并不会因为客户端的端口号相同,而导致连接冲突的问题。

比如下面这张图,有 2 个 TCP 连接,左边是客户端,右边是服务端,客户端使用了相同的端口 50004 与两个服务端建立了 TCP 连接。

图片

仔细看,上面这两条 TCP 连接的四元组信息中的「目的 IP 地址」是不同的,一个是 180.101.49.12 ,另外一个是 180.101.49.11。

多个客户端可以 bind 同一个端口吗?

bind 函数虽然常用于服务端网络编程中,但是它也是用于客户端的。

前面我们知道,客户端是在调用 connect 函数的时候,由内核随机选取一个端口作为连接的端口。

而如果我们想自己指定连接的端口,就可以用 bind 函数来实现:客户端先通过 bind 函数绑定一个端口,然后调用 connect 函数就会跳过端口选择的过程了,转而使用 bind 时确定的端口。

针对这个问题:多个客户端可以 bind 同一个端口吗?

要看多个客户端绑定的 IP + PORT 是否都相同,如果都是相同的,那么在执行 bind() 时候就会出错,错误是“Address already in use”。

如果一个绑定在 192.168.1.100:6666,一个绑定在 192.168.1.200:6666,因为 IP 不相同,所以执行 bind() 的时候,能正常绑定。

所以, 如果多个客户端同时绑定的 IP 地址和端口都是相同的,那么执行 bind() 时候就会出错,错误是“Address already in use”。

一般而言,客户端不建议使用 bind 函数,应该交由 connect 函数来选择端口会比较好,因为客户端的端口通常都没什么意义。

客户端 TCP 连接 TIME_WAIT 状态过多,会导致端口资源耗尽而无法建立新的连接吗?

针对这个问题要看,客户端是否都是与同一个服务器(目标地址和目标端口一样)建立连接。

如果客户端都是与同一个服务器(目标地址和目标端口一样)建立连接,那么如果客户端 TIME_WAIT 状态的连接过多,当端口资源被耗尽,就无法与这个服务器再建立连接了。

但是,因为只要客户端连接的服务器不同,端口资源可以重复使用的。

所以,如果客户端都是与不同的服务器建立连接,即使客户端端口资源只有几万个, 客户端发起百万级连接也是没问题的(当然这个过程还会受限于其他资源,比如文件描述符、内存、CPU 等)。

如何解决客户端 TCP 连接 TIME_WAIT 过多,导致无法与同一个服务器建立连接的问题?

前面我们提到,如果客户端都是与同一个服务器(目标地址和目标端口一样)建立连接,那么如果客户端 TIME_WAIT 状态的连接过多,当端口资源被耗尽,就无法与这个服务器再建立连接了。

针对这个问题,也是有解决办法的,那就是打开 net.ipv4.tcp_tw_reuse  这个内核参数。

因为开启了这个内核参数后,客户端调用 connect  函数时,如果选择到的端口,已经被相同四元组的连接占用的时候,就会判断该连接是否处于  TIME_WAIT 状态,如果该连接处于 TIME_WAIT 状态并且 TIME_WAIT 状态持续的时间超过了 1 秒,那么就会重用这个连接,然后就可以正常使用该端口了。

举个例子,假设客户端已经与服务器建立了一个 TCP 连接,并且这个状态处于  TIME_WAIT 状态:

客户端地址:端口           服务端地址:端口         TCP 连接状态
192.168.1.100:2222 172.19.11.21:8888 TIME_WAIT

然后客户端又与该服务器(172.19.11.21:8888)发起了连接,在调用 connect 函数时,内核刚好选择了 2222 端口,接着发现已经被相同四元组的连接占用了:

  • 如果没有开启net.ipv4.tcp_tw_reuse  内核参数,那么内核就会选择下一个端口,然后继续判断,直到找到一个没有被相同四元组的连接使用的端口, 如果端口资源耗尽还是没找到,那么 connect 函数就会返回错误。
  • 如果开启了 net.ipv4.tcp_tw_reuse  内核参数,就会判断该四元组的连接状态是否处于 TIME_WAIT 状态,如果连接处于 TIME_WAIT 状态并且该状态持续的时间超过了 1 秒,那么就会重用该连接,于是就可以使用 2222 端口了,这时 connect 就会返回成功。

再次提醒一次,开启了 net.ipv4.tcp_tw_reuse  内核参数,是客户端(连接发起方) 在调用 connect() 函数时才起作用,所以在服务端开启这个参数是没有效果的。

客户端端口选择的流程总结

至此,我们已经把客户端在执行 connect 函数时,内核选择端口的情况大致说了一遍,为了让大家更明白客户端端口的选择过程,我画了一流程图。

图片

总结

TCP 和 UDP 可以同时绑定相同的端口吗?

可以的。

TCP 和 UDP 传输协议,在内核中是由两个完全独立的软件模块实现的。

当主机收到数据包后,可以在 IP 包头的「协议号」字段知道该数据包是 TCP/UDP,所以可以根据这个信息确定送给哪个模块(TCP/UDP)处理,送给 TCP/UDP 模块的报文根据「端口号」确定送给哪个应用程序处理。

因此, TCP/UDP 各自的端口号也相互独立,互不影响。

多个 TCP 服务进程可以同时绑定同一个端口吗?

如果两个 TCP 服务进程同时绑定的 IP 地址和端口都相同,那么执行 bind() 时候就会出错,错误是“Address already in use”。

如果两个 TCP 服务进程绑定的端口都相同,而 IP 地址不同,那么执行 bind() 不会出错。

如何解决服务端重启时,报错“Address already in use”的问题?

当我们重启 TCP 服务进程的时候,意味着通过服务器端发起了关闭连接操作,于是就会经过四次挥手,而对于主动关闭方,会在 TIME_WAIT 这个状态里停留一段时间,这个时间大约为 2MSL。

当 TCP 服务进程重启时,服务端会出现 TIME_WAIT 状态的连接,TIME_WAIT 状态的连接使用的 IP+PORT 仍然被认为是一个有效的 IP+PORT 组合,相同机器上不能够在该 IP+PORT 组合上进行绑定,那么执行 bind() 函数的时候,就会返回了 Address already in use 的错误。

要解决这个问题,我们可以对 socket 设置 SO_REUSEADDR 属性。

这样即使存在一个和绑定 IP+PORT 一样的 TIME_WAIT 状态的连接,依然可以正常绑定成功,因此可以正常重启成功。

客户端的端口可以重复使用吗?

在客户端执行 connect 函数的时候,只要客户端连接的服务器不是同一个,内核允许端口重复使用。

TCP 连接是由四元组(源IP地址,源端口,目的IP地址,目的端口)唯一确认的,那么只要四元组中其中一个元素发生了变化,那么就表示不同的 TCP 连接的。

所以,如果客户端已使用端口 64992 与服务端 A 建立了连接,那么客户端要与服务端 B 建立连接,还是可以使用端口 64992 的,因为内核是通过四元祖信息来定位一个 TCP 连接的,并不会因为客户端的端口号相同,而导致连接冲突的问题。

客户端 TCP 连接 TIME_WAIT 状态过多,会导致端口资源耗尽而无法建立新的连接吗?

要看客户端是否都是与同一个服务器(目标地址和目标端口一样)建立连接。

如果客户端都是与同一个服务器(目标地址和目标端口一样)建立连接,那么如果客户端 TIME_WAIT 状态的连接过多,当端口资源被耗尽,就无法与这个服务器再建立连接了。即使在这种状态下,还是可以与其他服务器建立连接的,只要客户端连接的服务器不是同一个,那么端口是重复使用的。

如何解决客户端 TCP 连接 TIME_WAIT 过多,导致无法与同一个服务器建立连接的问题?

打开 net.ipv4.tcp_tw_reuse  这个内核参数。

因为开启了这个内核参数后,客户端调用 connect  函数时,如果选择到的端口,已经被相同四元组的连接占用的时候,就会判断该连接是否处于  TIME_WAIT 状态。

如果该连接处于 TIME_WAIT 状态并且 TIME_WAIT 状态持续的时间超过了 1 秒,那么就会重用这个连接,然后就可以正常使用该端口了。

责任编辑:武晓燕 来源: 小林coding
相关推荐
字节一面TCPUDP可以使用同一个端口
在网络通信中,同一台计算机中,TCP和UDP协议可以使用相同的端口号。每个网络进程中的套接字地址都是唯一的,由三元组(IP地址,传输层协议,端口号)标识。操作系统会根据数据包中的传输层协议(TCP或UDP)以及端口号,将接收到的数据正确地交付给相应的应用程序。

2024-03-05 10:07:22

TCP UDP 协议
字节一面TCPUDP使用同一个端口
对于TCP和UDP来说,尽管它们作为传输层的协议共享相同的端口号空间,但它们的端口是独立管理的。这意味着TCP和UDP可以使用相同的端口号而不会相互冲突。例如,TCP的80端口通常用于HTTP服务,而UDP的80端口可以被另一个服务使用,且两者不会相互干扰。

2024-03-18 08:21:06

TCP UDP 协议
字节一面:如何用 UDP 实现可靠传输?
实现的思路确实这样没错,但是有没有想过,既然TCP天然支持可靠传输,为什么还需要基于UDP实现可靠传输呢这不是重复造轮子吗

2022-05-10 22:00:41

UDP TCP 协议
SSLH:让HTTPSSSH共享同一个端口
SSLH允许我们在Linux系统上的端口443上运行多个程序服务。因此,你可以同时通过同一个端口同时使用SSL和SSH。如果你遇到大多数端口被防火墙阻止的情况,你可以使用SSLH访问远程服务器。这个简短的教程描述了如何在类Unix操作系统中使用SSLH让https、ssh共享相同的端口。

2019-08-20 10:24:39

HTTPS SSH Linux
3.7 同一个线程拿到的 session 是同一个
博主发表的文章,有的是自己原创,有的是这些年本人从网上积累的,方便大家学习。

2016-12-15 08:54:52

线程 session openSession
字节一面:HTTPS 会加密 URL
因为URL的信息都是保存在HTTPHeader中的,而HTTPS是会对HTTPHeader+HTTPBody整个加密的,所以URL自然是会被加密的。

2022-08-13 12:07:14

URL HTTP 加密
字节一面:HTTP 长连接 TCP 长连接有区别?
HTTP的KeepAlive也叫HTTP长连接,该功能是由「应用程序」实现的,可以使得用同一个TCP连接来发送和接收多个HTTP请求应答,减少了HTTP短连接带来的多次TCP连接建立和释放的开销。

2022-12-02 13:49:41

字节一面:HTTPS 定安全可靠
HTTPS协议本身到目前为止还是没有任何漏洞的,即使你成功进行中间人攻击,本质上是利用了客户端的漏洞(用户点击继续访问或者被恶意导入伪造的根证书),并不是HTTPS不够安全。

2022-08-18 17:44:25

HTTPS 协议 漏洞
字节一面TCP 三次握手,问的好细!
TCP三次握手中,客户端收到的第二次握手中ack确认号不是自己期望的,会发生什么?是直接丢弃or回RST报文?

2022-10-19 14:08:42

SYN TCP 报文
字节一面:能聊聊字节码么?
栈空间是有限的,如果只有入栈没有出栈,最后必然会出现空间不足,同时也就会报出经典的StackOverflowError(栈溢出错误),最常见的导致栈溢出的情况就是递归函数里忘了写终止条件。

2022-03-30 10:10:17

字节码 栈空间
让EclipseNetBeans共享同一个项目
NetBeans或eclipse互相支持对方的工程导入。

2009-06-09 12:38:12

NetBeans eclipse
嵌入式单片机,是同一个东西
凡是从事信息技术相关工作的童鞋,一定都听说过嵌入式和单片机。大家都知道,这两个名词,和硬件系统有着非常密切的关系。

2021-08-16 20:48:34

嵌入式 单片机 信息
多进程可以监听同一端口
算法虽然我们看不懂,但通过其注释我们可以知道,它返回的值的区间是[0,epro),再结合上面的reuseportselectsock方法我们可以确定,返回的就是所有listensocket的数组下标索引。

2021-01-18 06:18:25

监听 端口 数组
阿里最后一面:请设计一个秒杀系统
秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商品的特殊性,会吸引大量用户前来抢购,并且会在约定的时间点同时在秒杀页面进行抢购。

2019-10-31 13:58:32

阿里 电商 系统
字节一面:非递归手写快速排序
本文中讲解的套路就失效了,因此我们需要一种更加通用的方法将此类非尾递归代码转为递归代码,这种通用的方法是什么呢?

2022-10-10 08:13:16

递归 通用 代码
字节一面,被问到两经典问题!你知道是什么
当服务端出现大量CLOSEWAIT状态的连接的时候,通常都是代码的问题,这时候我们需要针对具体的代码一步一步的进行排查和定位,主要分析的方向就是服务端为什么没有调用close。

2022-12-13 18:09:25

连接 状态 客户端
字节一面:大白你了解网络分层么?
OSI的七层体系结构概念清楚,理论也很完整,但是它比较复杂而且不实用,而且有些功能在多个层中重复出现。

2022-01-05 21:54:51

网络 分层 系统
字节一面:服务端挂了,客户端的 TCP 连接还在吗?
如果「服务端挂掉」指的是「服务端进程崩溃」,那么这个读者猜的想法是对的,服务端的进程在发生崩溃的时候,内核会发送FIN报文,与客户端进行四次挥手。

2022-09-05 14:36:26

服务端 TCP 连接
字节一面,MySQL 行记录是怎么存储的
Compressed和Dynamic这两种格式采用完全的行溢出方式,记录的真实数据处不会存储该列的一部分数据,只存储20个字节的指针来指向溢出页。而实际的数据都存储在溢出页中。

2022-11-30 17:13:05

MySQL Dynamic 存储
云计算:一面生长,一面烧钱
无论是信创、东数西算,还是“双碳”,这些既是新的发展机遇,又是一个全新的挑战,这意味着,尚未盈利的云计算还需要加大投入,为企业长远发展做长期的打算,甚至将使企业在未来几年面临一面生长一面烧钱的局面。

2022-05-11 22:15:51

云计算 云平台

两个鬼故事罗氏起名大全超级红包神仙群中国式过马路剑神重生楚辞起名字大全男孩名字余家头懒懒散散星辰影院星辰影视星空影院天芳湖北省艺术学校起公司起名打分姓杨的起什么名好楚辞取名起名大全文库少林足球在线观看电车魔女2宋在熙起名 海宁波贸易公司起名算八字免费起名翘嘴鱼叫什么名字黄皮子坟给孩子起名字的软件乳清粉是什么东西姓氏何起名字女孩男新生儿起名字大全芊字起名的bd是什么意思租车公司起名字大全免费起名大全邓姓男孩项姓起名少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

两个鬼故事 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化