老席老席杂货铺
Picture of github

网络通讯方式概览

交换机通讯

交换机是通过广播的方式发送消息。在同一个局域网内,A主机想于B主机通讯,可以将消息发送到交换机,交换机将消息广播出去,因为消息中有mac 地址,当B主机收到消息后,检查这个消息是否是发给自己的,如果是自己的,就接收读取消息,如果不是自己的,就忽略这个消息。

交换机通讯缺点

  • 交换机的接口数量有上限
  • 大量主机放在同一个局域网会造成广播风暴,因为任意一台主机发送消息,其他所有主机都需要查看这个消息是否需有效

路由器通讯(不同局域网的主机通讯)

IP地址查找对应主机所在局域网

TCP协议

  • TCP属于传输层协议
  • TCP是面向连接的协议
  • TCP用于处理实时通信

TCP协议常见控制字段(简化)

  • SYN = 1 表示请求建立连接
  • FIN = 1 表示请求断开连接
  • ACK = 1 表示数据信息确认

TCP建立连接

tcp-connect.jpg

tcp-disconnect.jpg

  • 建立连接的时候,没有数据的发送,所以可以合并中间两次握手,总共为三次握手.
  • 4次挥手只是把SYN=1 变成了 FIN=1,为什么不能合并中间两次挥手?服务端是服务于多个客户端是,服务端跟客户端进行第二次挥手时,数据有可能还没有接收/发送结束,无法同时发送 FIN=1,所以无法合并.

TCP数据粘包问题及解决

数据在传输过程中是需要时间的,数据的消费也是需要时间的,TCP server 和 client 都是基于stream 的,client 将数据同步发送后,server端接受到数据后,如果暂时没有时间处理,就会放在缓冲区,然后等有时间处理时,再从缓冲区拿出数据处理,结果就是,如果client同时发送了多条数据,server端没有及时消费,就会将多次的数据放在缓冲区,等处理的时候就会一次拿出多条合并数据,当作一条数据处理,这就是数据粘包问题。

解决办法

  • client发送数据时,在多次数据发送中添加时间间隔。这样的解决方式缺点就是降低了数据的传输效率。
  • 通过封包、拆包来解决。封包的时候,会在header中添加本次传输数据的信息,这样在服务端处理数据的时候,可以根据包的信息决定如何处理。