go语言直播讲解 go语言( 三 )


现在很多phper转go开发,大部分都是冲着go的静态语言和协程去的,当然还有钱多 。
但是php自己其实也有协程支持,那就是 swoole 了 。
工作原因,有幸接触了一段时间swoole和go,希望对比下两者的区别 。
首先,网上很多大神关于swoole和go的对比,有的还是比较详细的 。
比如swoole官方就有一个对比swoole和go的文章: ;version=1compare=current
知乎大神文章:
感兴趣的话,可以 拜读一下 。
文章基本是围绕,swoole是单进程协程切换,go是MGP模型切换 。
swoole 的单进程模型 不能共享资源,没有线程并发问题,协程切换依赖io等等 。
对比下来 , 基本都是go性能比较突出 。
确实,go的性能比php高出不少,但同时也比php的学习和使用成本高很多 。而且 , 目前go的开发框架大都是基于beego或者gin,说好用真实有点昧良心 , 相比之下基于swoole的hyperf、mix-php都是开箱即用,包含了大部分需要的功能 , 二开也成本不高 。
总的来说,go的性能确实比php要高,但是使用成本也高出不少,同时由于静态语言天然的特性,比php这种弱类型语言在开发时的成本也要高出不少 。
基于协程的框架 , 抗并发性能基本都没大问题,如果后端存储能撑得?。?server端的并发基本不会有问题 。
swoole直播案例
Go 语言自我提升 (三次握手 - 四次挥手 - TCP状态图 - udp - 网络文件传输)三次握手:
1. 主动发起连接请求端(客户端),发送 SYN 标志位 , 携带数据包、包号
2. 被动接收连接请求端(服务器) , 接收 SYN,回复 ACK,携带应答序列号 。同时,发送SYN标志位,携带数据包、包号
3. 主动发起连接请求端(客户端) , 接收SYN 标志位 , 回复 ACK 。
被动端(服务器)接收 ACK —— 标志着 三次握手建立完成( Accept()/Dial() 返回 )
四次挥手:
1. 主动请求断开连接端(客户端),发送 FIN标志 , 携带数据包
2. 被动接受断开连接端(服务器),发送 ACK标志 , 携带应答序列号 。—— 半关闭完成 。
3. 被动接受断开连接端(服务器), 发送 FIN标志 , 携带数据包
4. 主动请求断开连接端(客户端),发送 最后一个 ACK标志,携带应答序列号 。—— 发送完成,客户端不会直接退出,等 2MSL时长 。
等 2MSL待目的:确保服务器 收到最后一个ACK
滑动窗口:
通知对端本地存储数据的 缓冲区容量 。—— write 函数在对端 缓冲区满时,有可能阻塞 。
TCP状态转换:
1. 主动发起连接请求端:
CLOSED —— 发送SYN —— SYN_SENT(了解) —— 接收ACK、SYN,回发 ACK —— ESTABLISHED (数据通信)
2. 主动关闭连接请求端:
ESTABLISHED —— 发送FIN —— FIN_WAIT_1 —— 接收ACK —— FIN_WAIT_2 (半关闭、主动端)
—— 接收FIN、回复ACK —— TIME_WAIT (主动端) —— 等 2MSL 时长 —— CLOSED
3. 被动建立连接请求端:
CLOSED —— LISTEN —— 接收SYN、发送ACK、SYN —— SYN_RCVD —— 接收 ACK —— ESTABLISHED (数据通信)
4. 被动断开连接请求端:
ESTABLISHED —— 接收 FIN、发送 ACK —— CLOSE_WAIT —— 发送 FIN —— LAST_ACK —— 接收ACK —— CLOSED
windows下查看TCP状态转换:
netstat -an | findstr端口号
Linux下查看TCP状态转换:
netstat -an | grep端口号
TCP和UDP对比:
TCP: 面向连接的可靠的数据包传递 。针对不稳定的 网络层,完全弥补 。ACK
UDP:无连接不可靠的报文传输 。针对不稳定的 网络层,完全不弥补 。还原网络真实状态 。

推荐阅读