图解TCPIP协议

  • 本文原文链接通过两个图来梳理TCP-IP协议相关知识。TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道。如图1所示,给出了TCP通信过程的示意图。

    图1主要包括三部分:建立连接传输数据断开连接

    建立TCP连接很简单,通过三次握手便可建立连接。

    建立好连接后,开始传输数据。TCP数据传输牵涉到的概念很多:超时重传快速重传流量控制拥塞控制等等。

    断开连接的过程也很简单,通过四次握手完成断开连接的过程。

    三次握手建立连接

    第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;

    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

    握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

    传输数据过程:

    超时重传

    超时重传机制用来保证TCP传输的可靠性。每次发送数据包时,发送的数据报都有seq号,接收端收到数据后,会回复ack进行确认,表示某一seq号数据已经收到。发送方在发送了某个seq包后,等待一段时间,如果没有收到对应的ack回复,就会认为报文丢失,会重传这个数据包。

    快速重传

    接受数据一方发现有数据包丢掉了。就会发送ack报文告诉发送端重传丢失的报文。如果发送端连续收到标号相同的ack包,则会触发客户端的快速重传(不用等到超时计时器结束即可确认数据包已经丢失)。比较超时重传和快速重传,可以发现超时重传是发送端在傻等超时,然后触发重传;而快速重传则是接收端主动告诉发送端数据没收到,然后触发发送端重传。

    流量控制

    这里主要说TCP滑动窗流量控制。TCP头里有一个字段叫Window,又叫Advertised-Window,这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。 滑动窗可以是提高TCP传输效率的一种机制。

    拥塞控制

    滑动窗用来做流量控制。流量控制只关注发送端和接受端自身的状况,而没有考虑整个网络的通信情况。拥塞控制,则是基于整个网络来考虑的。考虑一下这样的场景:某一时刻网络上的延时突然增加,那么,TCP对这个事做出的应对只有重传数据,但是,重传会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,于是,这个情况就会进入恶性循环被不断地放大。试想一下,如果一个网络内有成千上万的TCP连接都这么行事,那么马上就会形成“网络风暴”,TCP这个协议就会拖垮整个网络。为此,TCP引入了拥塞控制策略。拥塞策略算法主要包括:慢启动拥塞避免拥塞发生快速恢复

    四次握手断开连接

    第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但此时主动关闭方还可以接受数据。

    第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。

    第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。

    第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

    状态转换图

    图2给出了TCP通信过程中的状态转移图,理解此图是我们理解TCP-IP协议的关键。

    状态图详细解读:

    CLOSED:起始点,在超时或者连接关闭时候进入此状态。

    LISTEN:服务端在等待连接过来时候的状态,服务端为此要调用socket,bind,listen函数,就能进入此状态。此称为应用程序被动打开(等待客户端来连接)。

    SYN_SENT:客户端发起连接,发送SYN给服务器端。如果服务器端不能连接,则直接进入CLOSED状态。

    SYN_RCVD:跟3对应,服务器端接受客户端的SYN请求,服务器端由LISTEN状态进入SYN_RCVD状态。同时服务器端要回应一个ACK,同时发送一个SYN给客户端;另外一种情况,客户端在发起SYN的同时接收到服务器端得SYN请求,客户端就会由SYN_SENT到SYN_RCVD状态。

    ESTABLISHED:服务器端和客户端在完成3次握手进入状态,说明已经可以开始传输数据了。

    以上是建立连接时服务器端和客户端产生的状态转移说明。相对来说比较简单明了,如果你对三次握手比较熟悉,建立连接时的状态转移还是很容易理解。

    下面,我们来看看连接关闭时候的状态转移说明,关闭需要进行4次双方的交互,还包括要处理一些善后工作(TIME_WAIT状态),注意,这里主动关闭的一方或被动关闭的一方不是指特指服务器端或者客户端,是相对于谁先发起关闭请求来说的:

    FIN_WAIT_1:主动关闭的一方,由状态5进入此状态。具体的动作是发送FIN给对方。

    FIN_WAIT_2:主动关闭的一方,接收到对方的FIN-ACK(即fin包的回应包),进入此状态。

    CLOSE_WAIT:接收到FIN以后,被动关闭的一方进入此状态。具体动作是接收到FIN,同时发送ACK。(之所以叫close_wait可以理解为被动关闭方此时正在等待上层应用发出关闭连接指令)

    LAST_ACK:被动关闭的一方,发起关闭请求,由状态8进入此状态。具体动作是发送FIN给对方,同时在接收到ACK时进入CLOSED状态。

    CLOSING:两边同时发起关闭请求时,会由FIN_WAIT_1进入此状态。具体动作是接收到FIN请求,同时响应一个ACK。

    TIME_WAIT:最纠结的状态来了。从状态图上可以看出,有3个状态可以转化成它,我们一一来分析: 
    a. 由FIN_WAIT_2进入此状态:在双方不同时发起FIN的情况下,主动关闭的一方在完成自身发起的关闭请求后,接收到被动关闭一方的FIN后进入的状态。 
    b. 由CLOSING状态进入:双方同时发起关闭,都做了发起FIN的请求,同时接收到了FIN并做了ACK的情况下,由CLOSING状态进入。 
    c. 由FIN_WAIT_1状态进入:同时接受到FIN(对方发起),ACK(本身发起的FIN回应),与b的区别在于本身发起的FIN回应的ACK先于对方的FIN请求到达,而b是FIN先到达。这种情况概率最小。

    关闭的4次连接最难理解的状态是TIME_WAIT,存在TIME_WAIT的2个理由:

    可靠地实现TCP全双工连接的终止。 允许老的重复分节在网络中消逝。

    附:

    慢热启动算法 – Slow Start

    首先,我们来看一下TCP的慢热启动。慢启动的意思是,刚刚加入网络的连接,一点一点地提速,不要一上来就像那些特权车一样霸道地把路占满。新同学上高速还是要慢一点,不要把已经在高速上的秩序给搞乱了。

    慢启动的算法如下(cwnd全称Congestion Window):

    1)连接建好的开始先初始化cwnd = 1,表明可以传一个MSS大小的数据。

    2)每当收到一个ACK,cwnd++; 呈线性上升

    3)每当过了一个RTT,cwnd = cwnd*2; 呈指数让升

    4)还有一个ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算法”(后面会说这个算法)

    所以,我们可以看到,如果网速很快的话,ACK也会返回得快,RTT也会短,那么,这个慢启动就一点也不慢。

    拥塞避免算法 – Congestion Avoidance

    前面说过,还有一个ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算法”。一般来说ssthresh的值是65535,单位是字节,当cwnd达到这个值时后,算法如下:

    1)收到一个ACK时,cwnd = cwnd + 1/cwnd

    2)当每过一个RTT时,cwnd = cwnd + 1

    这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。很明显,是一个线性上升的算法。

    拥塞状态时的算法

    前面我们说过,当丢包的时候,会有两种情况:

    1)等到RTO超时,重传数据包。TCP认为这种情况太糟糕,反应也很强烈。

    view sourceprint?

    1.<code class=" hljs fix">sshthresh =  cwnd /2

    2.cwnd 重置为 1

    3.进入慢启动过程</code>

    2)Fast Retransmit算法,也就是在收到3个duplicate ACK时就开启重传,而不用等到RTO超时。

    TCP Tahoe的实现和RTO超时一样。

    view sourceprint?

    1.<code class=" hljs makefile">TCP Reno的实现是:

    2.cwnd = cwnd /2

    3.sshthresh = cwnd

    4.进入快速恢复算法——Fast Recovery</code>

    上面我们可以看到RTO超时后,sshthresh会变成cwnd的一半,这意味着,如果cwnd<=sshthresh时出现的丢包,那么TCP的sshthresh就会减了一半,然后等cwnd又很快地以指数级增涨爬到这个地方时,就会成慢慢的线性增涨。我们可以看到,TCP是怎么通过这种强烈地震荡快速而小心得找到网站流量的平衡点的。

    快速恢复算法 – Fast Recovery

    这个算法定义在RFC5681。快速重传和快速恢复算法一般同时使用。快速恢复算法是认为,你还有3个Duplicated Acks说明网络也不那么糟糕,所以没有必要像RTO超时那么强烈。 注意,正如前面所说,进入Fast Recovery之前,cwnd和sshthresh已被更新:

    view sourceprint?

    1.<code class=" hljs ini">cwnd = cwnd /2

    2.sshthresh = cwnd</code>

    然后,真正的Fast Recovery算法如下:

    cwnd = sshthresh + 3 * MSS(3的意思是确认有3个数据包被收到了) 
    重传Duplicated ACKs指定的数据包.如果再收到 duplicated Acks,那么cwnd = cwnd +1。如果收到了新的Ack,那么,cwnd = sshthresh ,然后就进入了拥塞避免的算法了。

    如果你仔细思考一下上面的这个算法,你就会知道,上面这个算法也有问题,那就是——它依赖于3个重复的Acks。注意,3个重复的Acks并不代表只丢了一个数据包,很有可能是丢了好多包。但这个算法只会重传一个,而剩下的那些包只能等到RTO超时,于是,进入了恶梦模式——超时一个窗口就减半一下,多个超时会超成TCP的传输速度呈级数下降,而且也不会触发Fast Recovery算法了。

    TCP New Reno

    于是,1995年,TCP New Reno(参见RFC 6582)算法提出来,主要就是在没有SACK的支持下改进Fast Recovery算法的—— 
    当sender这边收到了3个Duplicated Acks,进入Fast Retransimit模式,开发重传重复Acks指示的那个包。如果只有这一个包丢了,那么,重传这个包后回来的Ack会把整个已经被sender传输出去的数据ack回来。如果没有的话,说明有多个包丢了。我们叫这个ACK为Partial ACK。

    一旦Sender这边发现了Partial ACK出现,那么,sender就可以推理出来有多个包被丢了,于是乎继续重传sliding window里未被ack的第一个包。直到再也收不到了Partial Ack,才真正结束Fast Recovery这个过程。

    我们可以看到,这个“Fast Recovery的变更”是一个非常激进的玩法,他同时延长了Fast Retransmit和Fast Recovery的过程。

术语:

SYN表示建立连接,

FIN表示关闭连接,

ACK表示响应,

PSH表示有 DATA数据传输,

RST表示连接重置。

http://www.cnblogs.com/azraelly/archive/2012/12/25/2832393.html

时间: 2024-08-30 08:55:47

图解TCPIP协议的相关文章

图解ARP协议(六)RARP与IARP:被遗忘的兄弟协议

一.概述 在我第一次接触ARP协议的时候,发现这协议挺简单的,"一去一回通过IP拿到MAC地址",整个过程在1s内就搞定了.后面学到了代理ARP,发现也不过是变了个法子,做了次"欺骗",本质还是一样.接下来又学到了免费ARP,顿时觉得网络协议设计者太牛了,一个协议居然能折腾出这么多玩法,连"地址检测"都能实现.等学到了ARP嗅探和欺骗,又发现其实黑帽子更爱折腾,谁能想到这么简单的协议,居然能制造工具出来做内网探测和欺骗攻击,引发这么大的危害. 当

TcpIP协议,HTTP,DNS 实战:基于wireshark与BurpSuit抓包分析

TcpIP协议,HTTP,DNS 实战:基于wireshark与BurpSuite抓包分析

Java EE : 一、图解Http协议

目录 Java EE : 一.图解Http协议 Java EE : 二.图解 Cookie(小甜饼) Java EE : 三.图解Session(会话) 概述 一.技术基石及概述 二.深入理解技术基石和工作流程 三.详解工作过程的HTTP报文 四.HTTP协议知识补充 五.关于HTTP协议的Web应用框架或者规范 六.总结 参考 一.技术基石及概述 问:什么是HTTP?答:HTTP是一个客户端和服务器端请求和响应的标准TCP.其实建立在TCP之上的. 当我们打开百度网页时,是这样的: https

TCP-IP协议、状态详解

今天对TCP-IP协议做一个简单总结.以便日后自己查看. 本文通过两个图来梳理TCP-IP协议相关知识.TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道. 如图1所示,给出了TCP通信过程的示意图. 图1主要包括三部分:建立连接.传输数据.断开连接 一.概述: 1)建立TCP连接很简单,通过三次握手便可建立连接. 2)建立好连接后,开始传输数据.TCP数据传输牵涉到的概念很多:超时重传.快速重传.流量控制.拥塞控制等等. 3)断开连接的过程也很简单,通过四次握手完成断

【tcp-ip学习笔记】tcp-ip协议

tcp-ip的体系结构 TCP-iP协议体系结构分为四层,由高到低分别是:应用层,传输层,网络层,链路层,体系图如下 ①链路层 也称网络接口层,就是装得一些网络驱动层序,tcp-ip协议的重点不是链路层 ②网络层 也称互联网层,该层的主要协议就是IP协议了 ③传输层 主要有两个传输协议,一个是TCP一个是UDP ④应用层 就是应用程序比如QQ,MSN tcp-ip协议模式中边界 tcp-ip协议工作的过程 tcp-ip协议通信模型 步骤:①数据源以数据流形式经过传输层(TCP.UDP)形成数据段

学习笔记之TCPIP协议的重要性

1. 随处可见的协议 在计算机网络与信息通信领域里,人们经常提及"协议"一词.互联网中常 用的具有代表性的协议有IP.TCP.HITP等.而LAN(局域网)中常用的协议 有IPx/SPX等. "计算机网络体系结构"将这些网络协议进行了系统的归纳.TCP/lP就是 IP.TCP.HTTP等协议的集合.现在,很多设备都支持TCP/IP.除此之外,还 有很多其他类型的网络体系结构.例如,Novell公司的IPX/SPX.苹果公司的Ap- pleTalk(仅限苹果公司计算机

图解ARP协议(三)ARP防御篇-如何揪出&quot;内鬼&quot;并&quot;优雅的还手&quot;

一.ARP防御概述 通过之前的文章,我们已经了解了ARP攻击的危害,黑客采用ARP软件进行扫描并发送欺骗应答,同处一个局域网的普通用户就可能遭受断网攻击.流量被限.账号被窃的危险.由于攻击门槛非常低,普通人只要拿到攻击软件就可以扰乱网络秩序,导致现在的公共网络.家庭网络.校园网.企业内网等变得脆弱无比. 所以,如何进行有效的ARP防御?作为普通用户怎么防御?作为网络/安全管理员又怎么防御?有哪些ARP防御软件?如果被ARP攻击了,如何揪出"内鬼",并"优雅的还手"?

读《《图解TCP-IP》》有感

读<<图解TCP/IP>>有感 TCP/IP 最近几天读完<<图解TCP/IP>>,收获蛮多,记得上学时读stevens的<<TCP/IP详解>>时那是一个囫囵吞枣,没认真看也看不下去.等有时间再拜读下<<TCP/IP详解>>吧,估计能有不少共鸣. 现在觉得,要想比较透彻理解TCP/IP,还得需要有服务器编程经验,学校应该同时开设<socket编程>>相关课程,最好同一个老师教,可以串讲,不然

图解ARP协议(四)代理ARP原理与实践(“善意的欺骗”)

一.代理ARP概述 我:当电脑要访问互联网上的服务器,目标MAC是什么? 很多小伙伴在刚学习网络协议的时候,经常这样直接回应:不就是服务器的MAC嘛! 这时我会反问:那电脑怎么拿到这个服务器的MAC地址呢? 小伙伴一般都自信的抛出下面两个点: ①根据网络通信中数据封装的原则,通信双方需要封装源目IP和MAC地址: ②如果要拿到目标MAC地址,就需要通过ARP协议进行交互. 我:好,确实没毛病,你是指的下面这个意思吧 ==> 小伙伴:对对对,是这个意思的. 我:好,你再看看下面这个图,再确认下.