赞
踩
文章参考链接:
(视频讲解)https://www.bilibili.com/video/BV15E411K76A/?redirectFrom=h5
(公众号文章)
https://mp.weixin.qq.com/s/8t_KFtrrBkFyZKPJg_y6pw
要使每一方都能够确知对方的存在。
要允许双方协商一些参数(如最大窗口值,是否选用窗口扩大选项和时间戳选项以及服务质量等)
能够对运输实体资源进行分配(如缓存大小,连接表中的项目等)
作用是为了确认双方的(1)接收与(2)发送能力是否正常
TCP连接的建立采用客户服务区方式。TCP连接的过程叫做握手。握手需要在客户服务器之间交换三个TCP报文,称之为三报文握手。主要是为了防止已失效的连接请求报文突然又传送到了,因而产生错误。
刚开始双方TCP进程都处于关闭状态,客户主动打开连接,服务器被动打开连接,开始时TCP服务器先创建传输控制块TCB,准备接受客户进程的连接请求,此时服务器处于收听状态,等待客户连接请求。客户TCP进程首先创建传输控制块,在打算建立TCP连接时
客户端向服务器发出连接请求报文段,其首部中的同步位SYN=1,并选择序号 seq = x ,表明传输数据字节的序号是 x 。
TCP规定SYN=1的报文段不能携带数据,但要消耗掉一个序号,TCP客户端进入同步已发送状态。
服务器的TCP收到连接请求报文后,如同意则发回确认。
在确认报文段中应使**SYN=1,ACK =1,**其确认号 ack =x+1,(上一个序号加一),自己选择的序号 seq =y。
需要确认的地方就要有ACK,有ACK就要有ack。
这个报文段也不能携带数据,但同样要消耗掉一个序号,这时TCP服务器进入TCP同步接收状态。
TCP客户端收到确认报文后还要向服务器给出确认,其ACK=1,ack=y+1,(接收到seq+1),seq=x+1(自己上一次请求报文序号+1)
TCP报文段规定ACK报文段可以携带数据,不携带数据不消耗序号,这种情况下下一个报文段序号仍然是x+1,客户端的TCP通知上层应用进程,连接已经建立,客户端进入已连接状态。
服务器收到确认后也通知上层应用进程,进入已连接状态。
之后就可以进行数据传送
== 连接小结 ==:
刚开始双方TCP进程都处于关闭状态(closed),客户主动打开连接,服务器被动打开连接,服务器处于收听状态(listen 状态),等待客户连接请求。
客户端向服务器发出连接请求报文段:SYN=1, seq = x ,
TCP客户端进入同步已发送状态(SYN_Send)。
服务器的TCP收到连接请求报文后,发送确认报文段,SYN=1,ACK =1,ack =x+1 ,seq =y。
TCP服务器进入TCP同步接收状态(SYN_REVD ),使用半连接队列
TCP客户端收到确认报文后还要向服务器给出确认,其ACK=1,ack=y+1,seq=x+1
客户端进入已连接状态(establised )。
服务器收到确认后也进入已连接状态(establised )。
主动建立连接的客户端两个状态,被动建立连接的服务端三个状态
第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:(1)客户端的发送能力、(2)服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:(1)客户端的发送能力、(2)服务端的接收能力、(3)客户端的接收、(4)服务端的发送能力是正常的。
不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常
客户端的应用进程先向TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。
连接释放报文段首部FIN=1,其序号seq=u,(u为前面已经传输数据的最后一个字节的序号+1),进入终止等待状态,等待服务器的确认。
TCP规定FIN即使不携带数据也要消耗掉一个序号
服务器收到连接释放报文段后,发送确认ACK=1,ack=u+1,这个报文段自己的序号seq=v(服务器已经传送的数据的最后一个字节的序号+1),服务器处于关闭等待状态
若服务器已经没有数据要发送,其应用进程就通知TCP释放连接。因为要确认关闭FIN=1,ACK=1,ack=u+1(重复上次半关闭状态的确认号),seq=w。这时服务器进入最终确认状态,等待A的确认。
客户端在收到服务器的连接释放报文段后必须对其确认,ACK=1,ack=w+1,seq=u+1。
TCP标准,前面发送过的TCP报文段要消耗一个序号,进入时间等待状态。现在TCP报文连接没有释放,必须经过时间等待计时器设置的两倍的最长报文段(MSL)时间寿命后才进入关闭状态。
释放小结
刚开始都处于建立状态(ESTAB-LISHEN)
客户端先发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。
FIN=1,seq=u
客户端进入终止等待状态(FIN_WAIT1),等待服务器的确认。
服务器收到连接释放报文段后,发送确认ACK=1,ack=u+1,seq=v
服务器处于关闭等待状态(CLOSE_WAIT)
客户端收到确认依然在终止等待(FIN_WAIT2)
若服务器也要断开,就发送TCP连接释放报文。FIN=1,ACK=1,ack=u+1,seq=w。
服务器进入最终确认状态( LAST_ACK),等待A的确认。
客户端在收到服务器的连接释放报文段后必须对其确认,ACK=1,ack=w+1,seq=u+1。
客户端进入时间等待状态(TIME_WAIT)。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入关闭状态 (CLOSED )。
服务端收到 ACK 报文之后,就处于关闭状态( CLOSED)。
注意:
这里特别需要主要的就是TIME_WAIT这个状态了,这个是面试的高频考点,就是要理解,为什么客户端发送 ACK 之后不直接关闭,而是要等一阵子才关闭。这其中的原因就是,要确保服务器是否已经收到了我们的 ACK 报文,如果没有收到的话,服务器会重新发 FIN 报文给客户端,客户端再次收到 FIN 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。