写到头条字数限制 你还没搞明确TCP/IP协议吗?你是不是飘了?

作者:雅博体育app发布时间:2021-07-01 00:14

本文摘要:TCP协议剖析TCP是一个巨庞大的协议,因为它要解决许多问题,而这些问题又带出了许多子问题和阴暗面。所以学习TCP自己是个比力痛苦的历程,但对于学习的历程却能让人有许多收获。之所以想写这篇文章,目的有三个,一个是想磨炼一下自己是否可以用简朴的篇幅把这么庞大的TCP协议描清楚的能力。 另一个是以为现在的很多多少法式员基本上不会认认真真的读本书,喜欢快餐文化,所以,希望这篇快餐文章可以让你对TCP这个古典技术有所相识,并能体会到软件设计中的种种难出。

雅博体育app

TCP协议剖析TCP是一个巨庞大的协议,因为它要解决许多问题,而这些问题又带出了许多子问题和阴暗面。所以学习TCP自己是个比力痛苦的历程,但对于学习的历程却能让人有许多收获。之所以想写这篇文章,目的有三个,一个是想磨炼一下自己是否可以用简朴的篇幅把这么庞大的TCP协议描清楚的能力。

另一个是以为现在的很多多少法式员基本上不会认认真真的读本书,喜欢快餐文化,所以,希望这篇快餐文章可以让你对TCP这个古典技术有所相识,并能体会到软件设计中的种种难出。而且你可以从中有一些软件设计上的收获。

最重要的希望这些基础知识可以让你搞清许多以前一些似是而非的工具,而且你能意识到基础的重要。所以,本文不碰面面俱到,只是对TCP协议、算法和原理的科普。我原来只想写一个篇幅的文章的,可是TCP真的很庞大,比C++庞大多了,这30多年来,种种优化变种争论和修改。

所以,写着写着就发现只有砍成两部门。上半部门中,主要向你先容TCP协议的定以和丢包时的重传机制。下半部门中,重点先容TCP的流迭、拥塞处置惩罚。空话少说,首先,我们需要知道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(缩写为ISN:Inital 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端如果 在一定时间内没有收到的TCP会重发SYN-ACK。在Linux下,默认重试次数为5次,重试的距离时间从1s开始每次都翻售,5次的重试时间距离为 1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s都知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 2^6 -1 = 63s,TCP才会打断开这个毗连。关于SYN Flood攻击。

一些恶意的人就为此制造了SYN Flood攻击——给服务器发了一个SYN后,就下线了,于是服务器需要默认等63s才会断开毗连,这样,攻击者就可以把服务器的syn毗连的行列耗尽,让正常的毗连请求不能处置惩罚。于是,Linux下给了一个叫tcp_syncookies的 参数来应对这个事——当SYN行列满了后,TCP会通过源地址。


本文关键词:写到,头条,字数,限制,你,还没,搞,明确,TCP,TCP,雅博体育app

本文来源:雅博体育app-www.zhao-mm.com