当前位置: 首页 > news >正文

微信小程序网站开发教程wordpress sql文章

微信小程序网站开发教程,wordpress sql文章,各大网站流量排名,aspcms手机网站怎么做转自即时通讯网#xff1a;http://www.52im.net/ 前言 TCP是一个巨复杂的协议#xff0c;因为他要解决很多问题#xff0c;而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程#xff0c;但对于学习的过程却能让人有很多收获。关于TCP这个协议的细…转自即时通讯网http://www.52im.net/ 前言 TCP是一个巨复杂的协议因为他要解决很多问题而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程但对于学习的过程却能让人有很多收获。关于TCP这个协议的细节我还是推荐你去看W.Richard Stevens的《TCP/IP 详解 卷1协议》当然你也可以去读一下RFC793以及后面N多的RFC。另外本文我会使用英文术语这样方便你通过这些英文关键词来查找相关的技术文档。特别推荐TCP/IP协议理论经典《TCP/IP详解 卷1协议在线阅读版》、《TCP/IP详解 卷1协议CHM版》。 本文目的 之所以想写这篇文章目的有三个 一个是想锻炼一下自己是否可以用简单的篇幅把这么复杂的TCP协议描述清楚的能力。另一个是觉得现在的好多程序员基本上不会认认真真地读书喜欢快餐文化所以希望这篇快餐文章可以让你对TCP这个古典技术有所了解并能体会到软件设计中的种种难处。并且你可以从中有一些软件设计上的收获。最重要的希望这些基础知识可以让你搞清很多以前一些似是而非的东西并且你能意识到基础的重要。 所以本文不会面面俱到只是对TCP协议、算法和原理的科普。 系列文章 我本来只想写一个篇幅的文章的但是TCP真TMD的复杂比C复杂多了这30多年来各种优化变种争论和修改。所以写着写着就发现只有砍成两篇 《[通俗易懂]深入理解TCP协议上》主要向你介绍TCP协议的协议头、状态机、数据重传中的东西。本文《[通俗易懂]深入理解TCP协议下》重点介绍TCP的流迭、拥塞处理等。 更多参考资料 《高性能网络编程(一)单台服务器并发TCP连接数到底可以有多少》《高性能网络编程(二)上一个10年著名的C10K并发连接问题》《高性能网络编程(三)下一个10年是时候考虑C10M并发问题了》《高性能网络编程(四)从C10K到C10M高性能网络应用的理论探索》《不为人知的网络编程(一)浅析TCP协议中的疑难杂症(上篇)》《不为人知的网络编程(二)浅析TCP协议中的疑难杂症(下篇)》《不为人知的网络编程(三)关闭TCP连接时为什么会TIME_WAIT、CLOSE_WAIT》《不为人知的网络编程(四)深入研究分析TCP的异常关闭》《不为人知的网络编程(五)UDP的连接性和负载均衡》《不为人知的网络编程(六)深入地理解UDP协议并用好它》《不为人知的网络编程(七)如何让不可靠的UDP变的可靠》《网络编程懒人入门(一)快速理解网络通信协议上篇》《网络编程懒人入门(二)快速理解网络通信协议下篇》《网络编程懒人入门(三)快速理解TCP协议一篇就够》《网络编程懒人入门(四)快速理解TCP和UDP的差异》《网络编程懒人入门(五)快速理解为什么说UDP有时比TCP更有优势》《网络编程懒人入门(六)史上最通俗的集线器、交换机、路由器功能原理入门》《网络编程懒人入门(七)深入浅出全面理解HTTP协议》《网络编程懒人入门(八)手把手教你写基于TCP的Socket长连接》《脑残式网络编程入门(一)跟着动画来学TCP三次握手和四次挥手》《脑残式网络编程入门(二)我们在读写Socket时究竟在读写什么》《脑残式网络编程入门(三)HTTP协议必知必会的一些知识》 基础知识 废话少说首先我们需要知道TCP在网络OSI的七层模型中的第四层——Transport层IP在第三层——Network层ARP在第二层——Data Link层在第二层上的数据我们叫Frame在第三层上的数据叫Packet第四层的数据叫Segment。 首先我们需要知道我们程序的数据首先会打到TCP的Segment中然后TCP的Segment会打到IP的Packet中然后再打到以太网Ethernet的Frame中传到对端后各个层解析自己的协议然后把数据交给更高层的协议处理。 TCP协议头的格式 接下来我们来看一下TCP头的格式 你需要注意这么几点 TCP的包是没有IP地址的那是IP层上的事但是有源端口和目标端口。一个TCP连接需要四个元组来表示是同一个连接src_ip, src_port, dst_ip, dst_port准确说是五元组还有一个是协议。但因为这里只是说TCP协议所以这里我只说四元组。 注意上图中的四个非常重要的东西 Sequence Number是包的序号用来解决网络包乱序reordering问题。Acknowledgement Number就是ACK——用于确认收到用来解决不丢包的问题。Window又叫Advertised-Window也就是著名的滑动窗口Sliding Window用于解决流控的。TCP Flag 也就是包的类型主要是用于操控TCP的状态机的。 关于其它的东西可以参看下面的图示 TCP的状态机 其实网络上的传输是没有连接的包括TCP也是一样的。而TCP所谓的“连接”其实只不过是在通讯的双方维护一个“连接状态”让它看上去好像有连接一样。所以TCP的状态变换是非常重要的。 下面是“TCP协议的状态机”图片来源 和 “TCP建连接”、“TCP断连接”、“传数据” 的对照图我把两个图并排放在一起这样方便在你对照着看。另外下面这两个图非常非常的重要你一定要记牢。吐个槽看到这样复杂的状态机就知道这个协议有多复杂复杂的东西总是有很多坑爹的事情所以TCP协议其实也挺坑爹的 很多人会问为什么建连接要3次握手断开连接需要4次挥手 对于建连接的3次握手主要是要初始化Sequence Number 的初始值。通信的双方要互相通知对方自己的初始化的Sequence Number缩写为ISNInital Sequence Number——所以叫SYN全称Synchronize Sequence Numbers。也就上图中的 x 和 y。这个号要作为以后的数据通信的序号以保证应用层接收到的数据不会因为网络上的传输的问题而乱序TCP会用这个序号来拼接数据。对于4次挥手其实你仔细看是2次因为TCP是全双工的所以发送方和接收方都需要Fin和Ack。只不过有一方是被动的所以看上去就成了所谓的4次挥手。如果两边同时断连接那就会就进入到CLOSING状态然后到达TIME_WAIT状态。 下图是双方同时断连接的示意图你同样可以对照着TCP状态机看 另外有几个事情需要注意一下 关于建连接时SYN超时 试想一下如果server端接到了clien发的SYN后回了SYN-ACK后client掉线了server端没有收到client回来的ACK那么这个连接处于一个中间状态即没成功也没失败。于是server端如果在一定时间内没有收到会重发SYN-ACK。在Linux下默认重试次数为5次重试的间隔时间从1s开始每次都翻翻5次的重试时间间隔为1s, 2s, 4s, 8s, 16s总共31s第5次发出后还要等32s知道第5次也超时了所以总共需要 1s 2s 4s 8s 16s 32s 2^6 -1 63sTCP才会断开这个连接。关于SYN Flood攻击 一些恶意的人就为此制造了SYN Flood攻击——给服务器发了一个SYN后就下线了于是服务器需要默认等63s才会断开连接这样攻击者就可以把服务器的syn连接的队列耗尽让正常的连接请求不能处理。于是Linux下给了一个叫tcp_syncookies的参数来应对这个事——当SYN队列满了后TCP会通过源地址端口、目标地址端口和时间戳打造出一个特别的Sequence Number发回去又叫cookie如果是攻击者则不会有响应如果是正常连接则会把这个 SYN Cookie发回来然后服务端可以通过cookie建连接即使你不在SYN队列中。请注意请先千万别用tcp_syncookies来处理正常的大负载的连接的情况。因为synccookies是妥协版的TCP协议并不严谨。对于正常的请求你应该调整三个TCP参数可供你选择第一个是tcp_synack_retries 可以用他来减少重试次数第二个是tcp_max_syn_backlog可以增大SYN连接数第三个是tcp_abort_on_overflow 处理不过来干脆就直接拒绝连接了。关于ISN的初始化 ISN是不能hard code的不然会出问题的——比如如果连接建好后始终用1来做ISN如果client发了30个segment过去但是网络断了于是 client重连又用了1做ISN但是之前连接的那些包到了于是就被当成了新连接的包此时client的Sequence Number 可能是3而Server端认为client端的这个号是30了。全乱了。RFC793中说ISN会和一个假的时钟绑在一起这个时钟会在每4微秒对ISN做加一操作直到超过2^32又从0开始。这样一个ISN的周期大约是4.55个小时。因为我们假设我们的TCP Segment在网络上的存活时间不会超过Maximum Segment Lifetime缩写为MSL – Wikipedia语条所以只要MSL的值小于4.55小时那么我们就不会重用到ISN。关于 MSL 和 TIME_WAIT 通过上面的ISN的描述相信你也知道MSL是怎么来的了。我们注意到在TCP的状态图中从TIME_WAIT状态到CLOSED状态有一个超时设置这个超时设置是 2*MSLRFC793定义了MSL为2分钟Linux设置成了30s为什么要这有TIME_WAIT为什么不直接给转成CLOSED状态呢主要有两个原因1TIME_WAIT确保有足够的时间让对端收到了ACK如果被动关闭的那方没有收到Ack就会触发被动端重发Fin一来一去正好2个MSL2有足够的时间让这个连接不会跟后面的连接混在一起你要知道有些自做主张的路由器会缓存IP数据包如果连接被重用了那么这些延迟收到的包就有可能会跟新连接混在一起。你可以看看这篇文章《TIME_WAIT and its design implications for protocols and scalable client server systems》关于TIME_WAIT数量太多 从上面的描述我们可以知道TIME_WAIT是个很重要的状态但是如果在大并发的短链接下TIME_WAIT 就会太多这也会消耗很多系统资源。只要搜一下你就会发现十有八九的处理方式都是教你设置两个参数一个叫tcp_tw_reuse另一个叫tcp_tw_recycle的参数这两个参数默认值都是被关闭的后者recyle比前者resue更为激进resue要温柔一些。另外如果使用tcp_tw_reuse必需设置tcp_timestamps1否则无效。这里你一定要注意打开这两个参数会有比较大的坑——可能会让TCP连接出一些诡异的问题因为如上述一样如果不等待超时重用连接的话新的连接可能会建不上。正如官方文档上说的一样“It should not be changed without advice/request of technical experts”。 关于tcp_tw_reuse 官方文档上说tcp_tw_reuse 加上tcp_timestamps又叫PAWS, for Protection Against Wrapped Sequence Numbers可以保证协议的角度上的安全但是你需要tcp_timestamps在两边都被打开你可以读一下tcp_twsk_unique的源码 。我个人估计还是有一些场景会有问题。关于tcp_tw_recycle 如果是tcp_tw_recycle被打开了话会假设对端开启了tcp_timestamps然后会去比较时间戳如果时间戳变大了就可以重用。但是如果对端是一个NAT网络的话如一个公司只用一个IP出公网或是对端的IP被另一台重用了这个事就复杂了。建链接的SYN可能就被直接丢掉了你可能会看到connection time out的错误如果你想观摩一下Linux的内核代码请参看源码 tcp_timewait_state_process。关于tcp_max_tw_buckets 这个是控制并发的TIME_WAIT的数量默认值是180000如果超限那么系统会把多的给destory掉然后在日志里打一个警告如time wait bucket table overflow官网文档说这个参数是用来对抗DDoS攻击的。也说的默认值180000并不小。这个还是需要根据实际情况考虑。 Again使用tcp_tw_reuse和tcp_tw_recycle来解决TIME_WAIT的问题是非常非常危险的因为这两个参数违反了TCP协议RFC 1122 其实TIME_WAIT表示的是你主动断连接所以这就是所谓的“不作死不会死”。试想如果让对端断连接那么这个破问题就是对方的了呵呵。另外如果你的服务器是于HTTP服务器那么设置一个HTTP的KeepAlive有多重要浏览器会重用一个TCP连接来处理多个HTTP请求然后让客户端去断链接你要小心浏览器可能会非常贪婪他们不到万不得已不会主动断连接。 数据传输中的Sequence Number 下图是我从Wireshark中截了个我在访问coolshell.cn时的有数据传输的图给你看一下SeqNum是怎么变的。使用Wireshark菜单中的Statistics -Flow Graph… 你可以看到SeqNum的增加是和传输的字节数相关的。上图中三次握手后来了两个Len:1440的包而第二个包的SeqNum就成了1441。然后第一个ACK回的是1441表示第一个1440收到了。注意如果你用Wireshark抓包程序看3次握手你会发现SeqNum总是为0不是这样的Wireshark为了显示更友好使用了Relative SeqNum——相对序号你只要在右键菜单中的protocol preference 中取消掉就可以看到“Absolute SeqNum”了。 TCP重传机制 TCP要保证所有的数据包都可以到达所以必需要有重传机制。注意接收端给发送端的Ack确认只会确认最后一个连续的包比如发送端发了1,2,3,4,5一共五份数据接收端收到了12于是回ack 3然后收到了4注意此时3没收到此时的TCP会怎么办我们要知道因为正如前面所说的SeqNum和Ack是以字节数为单位所以ack的时候不能跳着确认只能确认最大的连续收到的包不然发送端就以为之前的都收到了。 1 超时重传机制 一种是不回ack死等3当发送方发现收不到3的ack超时后会重传3。一旦接收方收到3后会ack 回 4——意味着3和4都收到了。 但是这种方式会有比较严重的问题那就是因为要死等3所以会导致4和5即便已经收到了而发送方也完全不知道发生了什么事因为没有收到Ack所以发送方可能会悲观地认为也丢了所以有可能也会导致4和5的重传。对此有两种选择 一种是仅重传timeout的包。也就是第3份数据。另一种是重传timeout后所有的数据也就是第345这三份数据。 这两种方式有好也有不好。第一种会节省带宽但是慢第二种会快一点但是会浪费带宽也可能会有无用功。但总体来说都不好。因为都在等timeouttimeout可能会很长在下篇会说TCP是怎么动态地计算出timeout的。 2. 快速重传机制 于是TCP引入了一种叫Fast Retransmit 的算法不以时间驱动而以数据驱动重传。也就是说如果包没有连续到达就ack最后那个可能被丢了的包如果发送方连续收到3次相同的ack就重传。Fast Retransmit的好处是不用等timeout了再重传。 比如如果发送方发出了12345份数据第一份先到送了于是就ack回2结果2因为某些原因没收到3到达了于是还是ack回2后面的4和5都到了但是还是ack回2因为2还是没有收到于是发送端收到了三个ack2的确认知道了2还没有到于是就马上重转2。然后接收端收到了2此时因为345都收到了于是ack回6。示意图如下 Fast Retransmit只解决了一个问题就是timeout的问题它依然面临一个艰难的选择就是是重传之前的一个还是重传所有的问题。对于上面的示例来说是重传#2呢还是重传#2#3#4#5呢因为发送端并不清楚这连续的3个ack(2)是谁传回来的也许发送端发了20份数据是#6#10#20传来的呢。这样发送端很有可能要重传从2到20的这堆数据这就是某些TCP的实际的实现。可见这是一把双刃剑。   3 SACK方法 另外一种更好的方式叫Selective Acknowledgment (SACK)参看RFC 2018这种方式需要在TCP头里加一个SACK的东西ACK还是Fast Retransmit的ACKSACK则是汇报收到的数据碎版。参看下图 这样在发送端就可以根据回传的SACK来知道哪些数据到了哪些没有到。于是就优化了Fast Retransmit的算法。当然这个协议需要两边都支持。在 Linux下可以通过tcp_sack参数打开这个功能Linux 2.4后默认打开。 这里还需要注意一个问题——接收方Reneging所谓Reneging的意思就是接收方有权把已经报给发送端SACK里的数据给丢了。这样干是不被鼓励的因为这个事会把问题复杂化了但是接收方这么做可能会有些极端情况比如要把内存给别的更重要的东西。所以发送方也不能完全依赖SACK还是要依赖ACK并维护Time-Out如果后续的ACK没有增长那么还是要把SACK的东西重传另外接收端这边永远不能把SACK的包标记为Ack。注意SACK会消费发送方的资源试想如果一个攻击者给数据发送方发一堆SACK的选项这会导致发送方开始要重传甚至遍历已经发出的数据这会消耗很多发送端的资源。详细的东西请参看《TCP SACK的性能权衡》   4 Duplicate SACK – 重复收到数据的问题 Duplicate SACK又称D-SACK其主要使用了SACK来告诉发送方有哪些数据被重复接收了。RFC-2883 里有详细描述和示例。下面举几个例子来源于RFC-2883.D-SACK使用了SACK的第一个段来做标志 如果SACK的第一个段的范围被ACK所覆盖那么就是D-SACK如果SACK的第一个段的范围被SACK的第二个段覆盖那么就是D-SACK 示例一ACK丢包 下面的示例中丢了两个ACK所以发送端重传了第一个数据包3000-3499于是接收端发现重复收到于是回了一个SACK3000-3500因为ACK都到了4000意味着收到了4000之前的所有数据所以这个SACK就是D-SACK——旨在告诉发送端我收到了重复的数据而且我们的发送端还知道数据包没有丢丢的是ACK包。 Transmitted Received ACK Sent Segment Segment (Including SACK Blocks)3000-3499 3000-3499 3500 (ACK dropped) 3500-3999 3500-3999 4000 (ACK dropped) 3000-3499 3000-3499 4000, SACK3000-3500--------- 示例二网络延误 下面的示例中网络包1000-1499被网络给延误了导致发送方没有收到ACK而后面到达的三个包触发了“Fast Retransmit算法”所以重传但重传时被延误的包又到了所以回了一个SACK1000-1500因为ACK已到了3000所以这个SACK是D-SACK——标识收到了重复的包。这个案例下发送端知道之前因为“Fast Retransmit算法”触发的重传不是因为发出去的包丢了也不是因为回应的ACK包丢了而是因为网络延时了。 Transmitted Received ACK Sent Segment Segment (Including SACK Blocks)500-999 500-999 1000 1000-1499 (delayed) 1500-1999 1500-1999 1000, SACK1500-2000 2000-2499 2000-2499 1000, SACK1500-2500 2500-2999 2500-2999 1000, SACK1500-3000 1000-1499 1000-1499 30001000-1499 3000, SACK1000-1500--------- 可见引入了D-SACK有这么几个好处 1可以让发送方知道是发出去的包丢了还是回来的ACK包丢了。2是不是自己的timeout太小了导致重传。3网络上出现了先发的包后到的情况又称reordering4网络上是不是把我的数据包给复制了。 知道这些东西可以很好得帮助TCP了解网络情况从而可以更好的做网络上的流控。Linux下的tcp_dsack参数用于开启这个功能Linux 2.4后默认打开 好了上篇就到这里结束了。如果你觉得我写得还比较浅显易懂那么欢迎移步看下篇《[通俗易懂]深入理解TCP协议下》。
http://www.yutouwan.com/news/281849/

相关文章:

  • 建设网站考证wordpress商城支付
  • 地方旅游网站怎么做seo优化对网店的推广的作用为
  • 电子商务网站开发原则六安市 网站集约化建设
  • 靖江有帮助做苏宁易购网站的公司吗知道网站是wp程序做的如何仿站
  • 企业可以在哪些网站做免费宣传awada wordpress
  • 内容展示类网站网站套餐网页
  • 哪里查询网站备案江苏省建设厅官方网站公式公告
  • 莆田自助建站软件黑客钓鱼网站的制作
  • 上国外网站dns想学淘宝美工去哪里学
  • 百度网站的建设网站统计插件
  • 网站建设属于高新技术收入吗莱芜网络小说作家
  • 网站属性设置wordpress换域名把家
  • 做网站法人拍照背景做空间的网站
  • wordpress网站变灰实体店做团购有那些网站
  • wordpress建站哪里好内部网站建设、
  • 江苏城乡建设厅网站微信营销网络营销方式
  • 晋城门户网站建设建设新闻博客类网站要多大空间
  • 校园微网站建设方案ppt模板做个网页价格多少
  • 企业网站怎样做可以搜索到做二手钢结构网站有哪些
  • 六类网线制作为什么要懂seo
  • 做动漫网站推荐 网页游戏
  • 深圳网站建设制作设计桔子建站是什么平台
  • 36kr网站用什么做的在百度做网站需要什么资料
  • 中国核工业华兴建设有限公司网站网页设计制作的流程
  • 网站如何做3d产品展示写作的网站有哪些
  • 自建手机网站怎么修改自己的网站
  • 钮奇网站建设找人做的网站 没登录口
  • 北京网站备案拍照的地点站长网站查询工具
  • 怎么制作自己的网站网站站长要会什么用
  • 宝安网站设计服务怎样用js做网站轮播图