网络

网络知识体系(七) —— 其他

2021-05-28  本文已影响0人  Vic_wkx

转自 HuanBlog:这一篇 TCP 总结请收下

1.数据链路层的分块传输限制

运输层传输数据时,并不是把整个数据包加个首部就直接发送过去,而是把数据拆分成多个报文分开发送。这是因为数据链路层限制了数据长度只能有 1460。那么数据链路层为什么要做这样的限制呢?

这是因为网络是不稳定的。如果报文太长,那么极有可能在传输一半的时候突然中断了,这时要重传整个数据的话,代价非常大。把数据拆分之后,重传的代价就减轻了。

那么是不是拆分得越细越好呢?也不是,如果报文中数据字段太少,会导致首部占比过大,这样首部就会成为网络传输的最大负担了。

2.网络层的路由转换

在这样一个网络系统中:

路由转换

可以看出,使用路由转发的好处是:提高网络的容错率。即使坏掉了几个路由器,网络依旧畅通。但如果路由器 6 坏掉了,就会直接导致主机 A 和主机 B 无法再进行通信,所以要避免这种核心路由器的存在。

使用路由还有一个好处:分流。如果一条线路太堵,可以从别的路线进行传输,提高通信效率。

3.应用层的粘包与拆包

设想这样一个场景:应用层需要向目标进程发送两份数据,一份音频,一份文本

粘包与拆包

TCP 只知道接收到一个流时,把流拆分成数据包进行发送,中间第二个报文的数据包出现了两个文件的数据混在了一起,这就是 粘包。目标进程的应用层在接收到数据之后,需要把这些数据拆分成正确的两个文件,这就是 拆包

粘包与拆包都是应用层需要解决的问题,解决方法主要有:

4.恶意攻击

TCP 的面向连接特点可能会被人恶意利用,对服务器进行攻击。

当一台主机发送 SYN 包请求创建连接时,服务器会为这台主机创建 socket,然后返回 SYN+ACK 报文。如果有人伪造 IP 和端口,向服务器进行海量的请求,会使得服务器创建大量 socket,最终无法正常响应用户的请求,导致服务器瘫痪。

解决的办法有:限制 IP 的创建连接数、让创建一半的 TCP 连接在更短的时间内自动关闭、延缓接收缓冲区内存的分配等等。

5.长连接

客户端向服务器的每一次请求都需要创建一个 TCP 连接,服务器返回数据后就会关闭连接。如果在短时间内有大量的请求,那么频繁创建/断开 TCP 连接会非常浪费资源。所以我们可以让 TCP 连接暂时不要关闭,在这个期间进行多次请求,提高效率。

使用长连接时,服务器需要注意长连接维持时间、创建条件等,避免被人恶意利用,创建大量长连接,导致服务器资源耗尽。

上一篇下一篇

猜你喜欢

热点阅读