1.数据链路层的分块传输限制
运输层传输数据时,并不是把整个数据包加个首部就直接发送过去,而是把数据拆分成多个报文分开发送。这是因为数据链路层限制了数据长度只能有 1460。那么数据链路层为什么要做这样的限制呢?
这是因为网络是不稳定的。如果报文太长,那么极有可能在传输一半的时候突然中断了,这时要重传整个数据的话,代价非常大。把数据拆分之后,重传的代价就减轻了。
那么是不是拆分得越细越好呢?也不是,如果报文中数据字段太少,会导致首部占比过大,这样首部就会成为网络传输的最大负担了。
2.网络层的路由转换
在这样一个网络系统中:
路由转换- 正常情况下,主机 A 的数据包可以从 1-3-6-7 路径进行传输
- 如果路由 3 坏掉了,那么可以从 1-4-6-7 路径进行传输
- 如果路由 4 也坏掉了,那么可以从 2-5-6-7 进行传输
- 如果路由 5 也坏掉了,那么就只有中断线路了
可以看出,使用路由转发的好处是:提高网络的容错率。即使坏掉了几个路由器,网络依旧畅通。但如果路由器 6 坏掉了,就会直接导致主机 A 和主机 B 无法再进行通信,所以要避免这种核心路由器的存在。
使用路由还有一个好处:分流。如果一条线路太堵,可以从别的路线进行传输,提高通信效率。
3.应用层的粘包与拆包
设想这样一个场景:应用层需要向目标进程发送两份数据,一份音频,一份文本
粘包与拆包TCP 只知道接收到一个流时,把流拆分成数据包进行发送,中间第二个报文的数据包出现了两个文件的数据混在了一起,这就是 粘包。目标进程的应用层在接收到数据之后,需要把这些数据拆分成正确的两个文件,这就是 拆包。
粘包与拆包都是应用层需要解决的问题,解决方法主要有:
- 在每个文件的最后附加上一些特殊字节,如换行符
- 控制每个报文只包含一个文件的数据,不足的用 0 补齐
4.恶意攻击
TCP 的面向连接特点可能会被人恶意利用,对服务器进行攻击。
当一台主机发送 SYN 包请求创建连接时,服务器会为这台主机创建 socket,然后返回 SYN+ACK 报文。如果有人伪造 IP 和端口,向服务器进行海量的请求,会使得服务器创建大量 socket,最终无法正常响应用户的请求,导致服务器瘫痪。
解决的办法有:限制 IP 的创建连接数、让创建一半的 TCP 连接在更短的时间内自动关闭、延缓接收缓冲区内存的分配等等。
5.长连接
客户端向服务器的每一次请求都需要创建一个 TCP 连接,服务器返回数据后就会关闭连接。如果在短时间内有大量的请求,那么频繁创建/断开 TCP 连接会非常浪费资源。所以我们可以让 TCP 连接暂时不要关闭,在这个期间进行多次请求,提高效率。
使用长连接时,服务器需要注意长连接维持时间、创建条件等,避免被人恶意利用,创建大量长连接,导致服务器资源耗尽。
网友评论