2020-11-06第三天连接与tcp和udp

短连接|长连接

在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。

而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:Connection:keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

事例:短连接:web网页 ajax  http 长连接  :qq聊天 ,直播 ,rpc(远程控制软件)



swoole_get_local_ip()

此函数用于获取本机所有网络接口的 IP 地址

// 获取本机所有网络接口的IP地址$list = swoole_get_local_ip();print_r($list);

返回值

Array(

      [eno1] => 10.10.28.228

      [br-1e72ecd47449] => 172.20.0.1

      [docker0] => 172.17.0.1

)



健康检查

保持客户端会话的有效性健康平台客户端的忘了状态,使用了健康检查,两种实现方式:轮询机制,心跳机制

轮询机制:服务端定时请求客户端 是否还在链接

心跳机制:客户端定时发送请求到服务器端,一般使用该机制

daemonize  守护进程化【默认值:0】

设置 daemonize => 1 时,程序将转入后台作为守护进程运行。长时间运行的服务器端程序必须启用此项。

如果不启用守护进程,当 ssh 终端退出后,程序将被终止运行。

heartbeat_check_interval 启用心跳检测【默认值:false】

此选项表示每隔多久轮循一次,单位为秒。如 heartbeat_check_interval => 60,表示每 60 秒,遍历所有连接,如果该连接在 120 秒内(heartbeat_idle_time 未设置时默认为 interval 的两倍),没有向服务器发送任何数据,此连接将被强制关闭。若未配置,则不会启用心跳,该配置默认关闭,heartbeat_check 仅支持 TCP 连接

heartbeat_idle_time连接最大允许空闲的时间

需要与 heartbeat_check_interval 配合使用

array(

'heartbeat_idle_time'=>600,// 表示一个连接如果600秒内未向服务器发送任何数据,此连接将被强制关闭

'heartbeat_check_interval'=>60,// 表示每60秒遍历一次);

每个60秒遍历一次是否有长连接在进行,如果600秒内没有发送过数据将关闭长连接

提示

启用 heartbeat_idle_time 后,服务器并不会主动向客户端发送数据包

如果只设置了 heartbeat_idle_time 未设置 heartbeat_check_interval 底层将不会创建心跳检测线程,PHP 代码中可以调用 heartbeat 方法手工处理超时的连接


TCP的链接和断开链接

tcp的三次链接握手:第一次客户端发送请求询问是否可用链接 

                        第二次服务器发送可用请求的通知

                        第三次客户端发送请求数据

tcp断开链接的四次挥手:第一次发送请求断开

                    第二次服务器针对客户端的请求确认回答

                   第三次服务器发送断开链接请求

                    第四次客户端针对服务器的断开请求确认回答



粘包问题解决方案

    原因:tcp在数据传输时,以字节流的行书传输,并且会有tcp缓存形式每隔一段时间或者每隔一段字节发送一次数据,则会出现上次发送的数据和本次发送的数据,以一个数据包的形式发送到服务器,造成客户端以多次发送数据,单服务器接受以一次数据包接受

解决方案

    1 特殊字符:根据客户端和服务器相互约定的特殊符号,对接受的数据进行分割处理

     open_eof_check  打开 EOF 检测【默认值:false】, TCP 粘包问题

此选项将检测客户端连接发来的数据,当数据包结尾是指定的字符串时才会投递给 Worker 进程。否则会一直拼接数据包,直到超过缓存区或者超时才会中止。当出错时底层会认为是恶意连接,丢弃数据并强制关闭连接。

常见的 Memcache/SMTP/POP 等协议都是以 \r\n 结束的,就可以使用此配置。开启后可以保证 Worker 进程一次性总是收到一个或者多个完整的数据包。

array('open_eof_check'=>true,//打开EOF检测'package_eof'=>"\r\n",//设置EOF) 

//在每个包的后面追加一个\r\n 在服务器端接受到数据后,通过explain方法 截取字符串为数组为每次发送的数据

  2 固定包头+包体协议(主流) :通过与数据传输之后,在tcp数据包中了携带数据的长度然后,在服务器可以根据这个长度,对数据进行截取

    pack ()打包 WebSocket 消息。

unpack()

客户端:

        $content ="传输内容";

    $len=pack('n',strlen($content));

    $send =len.$content;

    $client->send($send);

服务器端

$server->set(array( 'open_length_check' => true,

 'package_max_length' => 81920,

 'package_length_type' => 'n',

 'package_length_offset' => 8,

 'package_body_offset' => 16,));


  $foolen=unpack("n",substr($data,0,2))[1];

  $content =substr($data,2,$foolen)


    open_length_check

打开包长检测特性【默认值:false】,参考 TCP 粘包问题

包长检测提供了固定包头 + 包体这种格式协议的解析。启用后,可以保证 Worker 进程 onReceive 每次都会收到一个完整的数据包。

长度检测协议,只需要计算一次长度,数据处理仅进行指针偏移,性能非常高

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335