TCP连接的三次握手和四次挥手

徘徊边缘 提交于 2019-12-01 19:16:48

TCP/IP协议是比较重要的网络协议,面试常常会被问到,在这里我整理一下我对TCP的一些了解。

 

上图是TCP报文段的首部格式:

源端口: 源机器端口号

目的端口:目的机器端口号

序列号 : 即 seq (注意是小写,在连接时候要用到),表示当前发送的数据是在整个文件中的位置(第几个字节)

确认序号: 即 ack(注意是小写,在连接时候要用到)  接收方告诉发送方下一次发送,发第几个字节

数据偏移:记录TCP报文段,从多少个字节后开始是数据,首部固定20,可变最多40,TCP首部最长60字节

保留位 :暂时没用,为以后留着

标识位:

SYN: 建立连接时候需要的同步信号,建立连接时候SYN置为1

URG: 当URG为1时,发送方TCP缓存中有1标记的数据包,可以插队,优先传输。

ACK:0的话,确认号无效,1的话,确认号有效。

RST: 若为1,说明TCP连接出现了严重错误,必须释放链接,重新建立会话。

PSH:若为1,则接收方缓存中的某个数据提前交给应用程序

FIN:通常意味着 所建立的连接需要关闭了,准备释放连接 FIN置为1

窗口:通讯双方在建立会话时吗,互相通知确认,将接收缓存和发送缓存的大小匹配

校验和:检查报文在传输过程中是否有丢失

紧急指针:当URG为1时才起作用。指明紧急数据在数据包内的结束位置。

选项:发送方最大报文长度和扩大接收方滑动窗口等信息。

 

TCP建立连接的3个步骤:

1:客户A向服务器B发起请求 : SYN = 1 (要建立请求了,同步信号置为1),ACK=0(ACK=0是无效的,只是标识一下),seq =x (发送的字节数)。此时A的状态为 SYN-SENT
2:服务器B收到 A的请求,同意此条请求。并且向客户A返回信息。ack =x+1(告诉A该发第x+1个字节上的数据了),seq=y(B现在发送的数据在完整文件的第y个。),ACK=1(ACK=1,证明现在确认号ack是有效的),SYN=1(同意连接,同步信号置为1,确认号ack总是等于上一次请求的序号+1)。
3:客户A再向服务器B发送一次请求。      ACK=1,seq=x+1,ack=y+1 。  至此A的状态变为ESTABLISHED,B收到第3次请求后,状态变为        ESTABLISHED 。 连接建立,双方开始通讯。

注意:为什么A还要发送第三次请求确认呢?即 为什么要第3次握手?

假设是2次握手就可以建立连接,A第一次发送了建立连接的请求,但是这条请求由于网络堵塞,迟迟没有到达服务器B,但是这条请求一直还在到达B的路上。 

A尝试着又发送了一次建立连接的请求,这条请求比较顺畅的在第一次请求之前到达了B,B此时向A返回信息。此时连接建立,A的状态成为了ESTABLISHED。 此时,A的第一次建立连接的请求到达了B,B认为A又发送了一次建立连接的请求,B向A返回信息,连接已经建立,B在等待A的通信,但是A此时的状态是ESTABLISHED,所以此时的A不认刚才的第一次连接,而对B置之不理,导致B一直干等着,浪费资源。

若是3次握手,B在收到A的第一次超时连接时候,B依然向A返回信息(第二次握手),但是A此时的状态是ESTABLISHED,所以此时的A不认刚才的第一次连接,A也一直不理B,一直没有进行第三次握手,此时B就认为此时的连接是异常的,也不会干等着A的回应,所以就释放掉了异常的连接。

 

 

1:客户A认为连接需要关闭了,发送第一次关闭请求。FIN=1,seq=u。(FIN置为1,证明A说:我想关闭了)

2:B向A返回信息 ack=u+1,seq=v,ACK=1  (ACK=1,B说我答应你,可以断开,但是得等我处理完数据,我说断开时候你再断开。同时B通知应用进程A想断开连接了,快将剩余的信息发完,处理现场信息,关闭相关资源) 此时B还是可以向A发送数据的,但是A不能向B发了。此时A状态为半关闭状态。

3:B在处理完数据,做好关闭连接前的准备工作了,再向A返回信息。ack=u+1,seq=w,ACK=1,FIN=1。此时B的状态也是半关闭状态。

4:A再向B发送最后一次信息:ACK=1,seq=u+1,ack=w+1。B收到此条请求后,B关闭了连接,状态为CLOSED。A的状态为等待关闭状态,等待2MSL时间后,A没有收到B传来的消息,则A就可以确定B收到了它的上一次确认关闭请求,B关闭了。此时A也CLOSED,TCP连接正式释放。

MSL:是报文在网络上生存的最长时间,是2分钟,2MSL是4分钟。 那么A为什么非要等待2MSL才可以最终关闭呢?

1:如果第四次挥手信息(ACK),由于网络原因没能顺利的达到B,处于LAST-ACK状态的B,会以为它的上一次挥手,即图中序号3(带FIN 和ACK的信息),A没有收到。所以就重发一次3。A收到这个第二次的3时,会再向B发送一次4(ACK),并且开始等待2SML,正常等待最终关闭。        如果A收到B的3(FIN和ACK信息)后,就向B发送4(ACK)指令,而不等待2MSL,进入CLOSED状态,那么可能会导致B不能确保收到最后的ACK指令,B也无法进入CLOSED状态。

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!