长连接和短连接
1. TCP和UDP
1. UDP: 面向无连接的通信协议, 数据包括目的端口信息和源端口信息
优点:
面向无连接, 操作简单, 要求系统资源叫少速度较快, 由于不需要连接, 可进行广播发送
缺点:
发送数据之前不需要与对方建立连接, 接收到的数据也不需要发送确认信号, 发送端不知道接收端是否正确接收, 不会重发, 不可靠
2. TCP: 面向连接的通讯协议, 通过三次握手建立连接
优点:
在数据传输时, 有确认, 窗口, 重传, 拥塞控制机制, 能保证数据的正确性, 较为可靠
缺点:
速度慢, 要求系统资源多
2. 短连接
连接 -> 传递数据 -> 关闭连接
短连接是指SOCKET连接后, 发送接收完数据后马上断开连接, 因为连接后接收了数据就断开了, 所以每次数据接受处理不会有联系, 也是HTTP协议无状态的原因之一
优点:
对于服务器来说较为简单, 存在的连接都是有用的连接, 不需要额外的控制
缺点:
如果客户端连接频繁, 会在tcp的建立和关闭上浪费时间
3. 长连接(指的是TCP连接, 而不是HTTP连接!!)
连接 -> 传输数据 -> 保持连接 -> 传输数据....-> 直到一方关闭连接, 多是客户端关闭连接
长连接指建立SOCKET连接后不管是否使用都保持连接, 在一次连接中处理多个请求, 并且多个请求可以重叠执行, 不需要等待, 但是安全性差
实现:
在请求响应头加入: Connection: keep-alive
优点:
可以省去较多的TCP建立/关闭操作, 减少浪费, 节约时间, 对于频繁请求资源的客户, 较适用于长连接
缺点:
随着客户越来越多, 服务器会难以应付
解决方案:
1. 关闭一些长时间不执行读写操作的连接
2. 以客户端为颗粒度, 限制每个客户端的最大连接数
4. 发送和接收方式
1. 异步
报文发送和接收是分开的, 相互独立, 互不影响的
1. 异步双工
接收和发送在同一程序中, 有两个不同的子进程分别负责发送和接收
2. 异步单工
接收和发送采用不同的程序完成
2. 同步
报文的发送和接收是同步进行, 即报文发送后等待接收返回报文, 超过等待时间发送方不再等待读返回报文。直接通知超时返回。
5. 报文格式
1. 非阻塞方式
读函数不停的进行读动作, 如果报文没有收到, 超时后返回
2. 阻塞方式
如果没有接收到报文, 则读函数一直处于等待状态, 直到报文送达
3. 循环读写方式
在一次接收或发送报文的动作中一次性不加分别的全部读取或全部发送报文字节
4. 不指定长度循环读写
发生在短连接进程中,受网络路由等限制,一次较长的报文可能在网络传输过程中被分解成很多个包,一次读取可能不能全部读完一次报文,这就需要循环读取报文,知道读完为止。
5. 带长度报文头循环读写
这种情况一般在长连接中,由于在长连接中没有条件能[]够判断循环读写什么时候结束。必须要加长度报文头。
6. 适用场景
短连接:
适用于网页浏览等并发量大且用户不需要频繁的交互式操作的场景
长连接:
适用于客户端和服务端通信频繁的场景
点对点通讯等连接不多的场景