【网络】TCP的连接建立
TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP运输连接的建立和释放是每一次连接通信过程中必不可少的。因此,运输连接就有三个阶段:连接建立,数据传送和连接释放。需要解决以下3个问题:连接建立这个过程,需要在客户端和服务器之间,交换3个TCP报文段,也就是三次握手????x3。????请注意,在本例中,A主动打开连接,B被动打开连接一开始,B就在准备接受客户进程的连接请求,然后服务器进程就处于 LISTEN (收听)状态,等待客户的连接请求。如有,即作出响应。A的TCP客户进程像B发出连接请求报文段,这时,首部中的同步位SYN = 1,同时选择一个初始序号 seq = x 。TCP规定????,SYN报文段不能携带数据,但要消耗掉一个序号。这时,TCP客户进程进入SYN-SENT(同步已发送)状态。B收到连接请求的报文段后,如同意建立连接,则向A发送确认。在确认报文段中,应把SYN位和ASK位都置1,确认号是 ack = x + 1 ,同时也为自己选择一个初始序号 seq = y 。请注意,这个报文段也不能携带数据。但同样要消耗掉一个序号。这时,TCP服务器进程进入SYN-RCVD(同步收到)状态。TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号 ack = y + 1 ,而自己的序号 seq = x + 1 。TCP的标准规定????,ACK报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是 seq = x +1 。这时,TCP连接已经建立????,A进入ESTABLISHED(已建立连接)状态。当B收到A的确认后,也进入ESTABLISHED(已建立连接)???? Q:为什么A最后还有发送一次确认呢?????A:主要是为了防止已失效的连接请求报文段突然又传送到B,因而产生错误。所谓“已失效的连接请求报文段”是这样产生的。????考虑一种正常情况,A 发出连接请求????,但因连接请求报文丢失而未收到确认。于是A再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。A共发出了两个连接请求的报文段,其中第一个丢失????,第二个到达了B????,没有“已失效的连接请求报文段”。????现假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某个网络节点长时间的滞留????,以至延误到连接释放以后的某个时间才到达B。本来这是一个 早已失效的报文段 ,但是B收到此时小的连接请求的报文段之后,误以为是A又发出一次新的连接请求。于是向A发出确认报文段,同意建立连接。假定不采用报文握手。那么只要B发出确认之后,新的连接就建立了。由于现在A并没有发出建立连接的请求,因此不会理睬B的确认????,也不会向B发送数据,但B确以为新的运输连接已经建立,并一直等待A发来的数据。B的许多资源就这样白白浪费了。

图解TCP建立连接全过程
TCP是因特网中的传输层协议,使用三次握手协议建立连接,下面是TCP建立连接的全过程。 上图画出了TCP建立连接的过程。假定主机A是TCP客户端,B是服务端。最初两端的TCP进程都处于CLOSED状态。图中在主机下面的是TCP进程所处的状态。A是主动打开连接,B是被动打开连接。首先A向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN报文段不能携带数据,但要消耗掉一个序号。这时,A进入SYN-SENT状态。B收到请求后,向A发送确认。在确认报文段中把SYN和ACK位都置为1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。请注意,这个报文段也不能携带数据,但同样要消耗掉一个序号。这时B进入SYN-RCVD状态。A收到B的确认后,还要向B给出确认。确认报文段的ACK置为1,确认号ack=y+1,而自己的序号seq=x+1。这时,TCP连接已经建立,A进入ESTABLISHED状态,当B收到A的确认后,也会进入ESTABLISHED状态。以上给出的连接建立过程就是常说的TCP三次握手。为什么A还要发送一次确认呢?这主要是为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误。所谓已失效的连接请求报文段是这样产生的。A发送连接请求,但因连接请求报文丢失而未收到确认,于是A重发一次连接请求,成功后建立了连接。数据传输完毕后就释放了连接。现在假定A发出的第一个请求报文段并未丢失,而是在某个网络节点长时间滞留了,以致延误到连接释放以后的某个时间才到达B。本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误以为A又发了一次新的连接请求,于是向A发出确认报文段,同意建立连接。假如不采用三次握手,那么只要B发出确认,新的连接就建立了。由于A并未发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输连接已经建立了,并一直等待A发来数据,因此白白浪费了许多资源。 采用TCP三次握手的方法可以防止上述现象发生。例如在刚才的情况下,由于A不会向B的确认发出确认,连接就不会建立。下面留个思考题给大家:如果在TCP第三次握手中的报文段丢失了会发生什么情况?

简述TCP的三次握手过程。
TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手. 完成三次握手,客户端与服务器开始传送数据
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认。第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据。简版:首先A向B发SYN(同步请求),然后B回复SYN+ACK(同步请求应答),最后A回复ACK确认,这样TCP的一次连接(三次握手)的过程就建立了。三次握手我们先明确两个定义:1,client为数据发送方2,server为数据接收方好,下面进行三次握手的总结:1,client想要向server发送数据,请求连接。这时client向服务器发送一个数据包,其中同步位(SYN)被置为1,表明client申请TCP连接,序号为j。2,当server接收到了来自client的数据包时,解析发现同步位为1,便知道client是想要简历TCP连接,于是将当前client的IP、端口之类的加入未连接队列中,并向client回复接受连接请求,想client发送数据包,其中同步位为1,并附带确认位ACK=j+1,表明server已经准备好分配资源了,并向client发起连接请求,请求client为建立TCP连接而分配资源。 3,client向server回复一个ACK,并分配资源建立连接。server收到这个确认时也分配资源进行连接的建立。
A与B建立TCP连接时:首先A向B发SYN(同步请求),然后B回复SYN+ACK(同步请求应答),最后A回复ACK确认,这样TCP的一次连接(三次握手)的过程就建立了!

网络的五层划分,TCP与UDP的区别,TCP的三次握手过程
化繁为简是人们解决复杂问题的常用方法,对计算机网络划分就是为了将计算机网络这个庞大的复杂的问题划分为简单的问题。通过“分而治之”解决简单的问题,从而解决复杂的问题。 五层划分是根据ISO/OSI参考模型和TCP/IP体系结构而来的 为了更好的学习计算机网络。他的五层分别是(从低到高):物理层、数据链路层、网络层、传输层和应用层。下面对以上几个层次进行简单的介绍1、物理层物理层为最底层。为数据链路层提供物理连接,传输比特流。物理层的特性包括电压、频率、数据传输速率、最大传输距离等。2、数据链路层数据链路层建立在通信和实体之间,传输以“帧”为单位的数据。保证点到点的可靠性传输。3、网络层网络层主要功能是为处在不同网络系统中的两个节点通信提供一条逻辑通道。基本任务包括路由选择、拥塞控制、网络互连等。4、传输层(最关键的一层,TCP工作在这一层)传输层为用户提供“端到端”的服务。透明的传送报文。他屏蔽了下次数据通信的细节,因此很关键。该层关系的主要问题是包括建立连接、维护和中断虚电路、传输差错校验和恢复,以及信息流量控制机制等。5.应用层应用层是最靠近用户的OSI层,这一层作为用户的应用程序(例如电子邮件、 文件传输 和终端仿真)来提供网络服务。我们假设A公司要给B公司发送邮件 老板叫 秘书来一下 你把这个邮件 寄到B公司 秘书找到顺丰快递告诉小哥 我要寄件 把这个寄到那那那(B公司地址等信息)然后快递小哥打包放在他车里 到了晚上或者某一规定时间 统一的 把他送到集散中心 装箱 送到 飞机上之后就是逆向过程 在这中间 秘书不需要知道 我的邮件是怎么运输的 我不管 你就给我运就行了 每一层 做自己的事情互不干扰。TCP三次握手中有一些词要用到先简单解释一下TCP序列号(序列码SN,Sequence Number) :32位的序列号标识了TCP报文中第一个byte在对应方向的传输中对应的字节序号。当SYN出现,序列码实际上是初始序列码(ISN),而第一个数据字节是ISN+1,单位是byte。TCP应答号(Acknowledgment Number简称ACK Number或简称为ACK Field) :32位的ACK Number标识了报文发送端期望接收的字节序列。如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。ACK(Acknowledgment) :取值1代表Acknowledgment Number字段有效,这是一个确认的TCP包,取值0则不是确认包。SYN(Synchronize) :同步序列编号(Synchronize Sequence Numbers)有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。FIN(Finish) :带有该标志置位的数据包用来结束一个TCP会话,但对应端口仍处于开放状态,准备接收后续数据。当FIN标志有效的时候我们称呼这个包为FIN包。上图已经说明了三次握手的过程。1、首先由主机A发出请求连接即 SYN=1 ACK=0 (请看上面的介绍), TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=2002、然后 Server 进行回复确认,即 SYN=1 ACK=1 seq=500, ack=200+1,3、再然后主机A再进行一次确认,但不用SYN 了,这时即为 ACK=1, seq=200+1, ack=500+1.然后连接建立1、当主机A 没有东西要发送时就要释放 A 这边的连接,A会发送一个报文(没有数据),其中 FIN 设置为1。2、主机B收到后会给应用程序一个信,这时A那边的连接已经关闭,即A不再发送信息(但仍可接收信息)。3、A收到B的确认后进入等待状态,等待B请求释放连接, B数据发送完成后就向A请求连接释放,也是用FIN=1 表示, 并且用 ack =100+1(如图)。4、 A收到后回复一个确认信息,并进入 TIME_WAIT 状态, 等待 2MSL 时间。为什么要等待呢?为了这种情况: B向A发送 FIN = 1 的释放连接请求,但这个报文丢失了, A没有接到不会发送确认信息, B 超时会重传,这时A在WAIT_TIME 还能够接收到这个请求,这时再回复一个确认就行了。(A收到 FIN = 1 的请求WAIT_TIME会重新记时)另外主机B存在一个保活状态,即如果A突然故障死机了,那B那边的连接资源什么时候能释放呢? 就是保活时间到了后,B会发送探测信息, 以决定是否释放连接。我在网上找了一个例子三次握手:A:“喂,你听得到吗?”A->SYN_SENDB:“我听得到呀,你听得到我吗?”应答与请求同时发出 B->SYN_RCVD | A->ESTABLISHEDA:“我能听到你,今天balabala……”B->ESTABLISHED四次挥手:A:“喂,我不说了。”A->FIN_WAIT1B:“我知道了。等下,上一句还没说完。Balabala…..”B->CLOSE_WAIT | A->FIN_WAIT2B:”好了,说完了,我也不说了。”B->LAST_ACKA:”我知道了。”A->TIME_WAIT | B->CLOSEDA等待2MSL,保证B收到了消息,否则重说一次”我知道了”,A->CLOSEDTCP提供面向连接的可靠的(没有数据重复或丢失)全双工的数据流传输服务,每一个TCP连接可靠地建立,优雅的关闭,保证数据在连接关闭之前被可靠地投递到目的地。 UDP面向非连接的,不可靠的传输服务。它使用ip数据包携带数据,但增加了对给定主机上多个目标进行区分的能力。UDP既不使用确认信息对数据的到达进行确认,也不对收到的数据进行排序,因此可能出现丢失、重复、或乱序现象。

画图描述tcp三次握手建立连接的过程。
答:如下图所示。客户端主动发出请求,并令其SYN=1, 并设置S1Q序号值等于X;服务器端接收到请求之后进行响应,发送SYN=1,ACK=1,表示同意建立连接,开始分配服务器资源。同时服务器端发送序号seq=y,服务器期待收到的数据序号ack=x+1;客户端收到服务器的期待以后,并发送序号seq=x+1对应的数据,同时ack=y+1表示期待收到序号为y+1对应的数据;

本文由 在线网速测试 整理编辑,转载请注明出处。