网络编程-三次握手,四次挥手

TCP传输过程

TCP传输过程主要分为三个阶段
(1)建立连接:三次握手
(2)数据传输:传输数据过程中,每次都需要确认数据是否成功接收。
(2)断开连接:四次挥手

TCP报文类型:SYN/ACK

SYN(连接请求信号):同步序列编号(Synchronize Sequence Numbers)是TCP/IP建立连接时使用的握手信号,TCP连接的第一个包,非常小的一种数据包。

ACK(应答信号):确认标识(Acknowledge character)是对所收到的报文进行检查,若未发现错误,便向对方发出确认回答ACK信号,表明信息已被正确接收,并准备好接收下一份报文。
在这里插入图片描述

一、建立连接:TCP三次握手

在这里插入图片描述
第一次握手:建立连接时,客户端发送SYN包(seq=x)到服务器,并且此时客户端进入SYN_SENT状态,等待服务器确认;

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

第三次握手:客户端收到服务器发送的SYN+ACK包后,同时向服务器发送确认包ACK(ack=y+1),此包发送完毕,此时客户端进入ESTABLISHED状态,服务器收到应答包ACK,也进入ESTABLISHED状态便完成三次握手,TCP连接成功。

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

二、数据传输

完成三次握手后,客户端与服务器开始传送数据。

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

(2)快速重发机制:接受端发现有数据包丢失了,就会主动发送ACK报文告诉发送端重发丢失的报文。如果发送端连续收到标号相同的ack包,则会触发客户端的快速重发。

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

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

三、断开连接:TCP四次挥手

在这里插入图片描述
第一次挥手:客户端发送一个FIN(seq = u)报文,准备关闭客户端到服务器的数据传输。
客户端进入FIN_WAIT_1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。(但是在FIN报文之前发送出去的数据,如果客户端没有接收到对应的ACK确认报文,客户端依然会重发这些数据,此时服务器仍然可以接收数据。)

第二次挥手
(1)服务器收到FIN报文后,会给客户端确认回复一个ACK(ack = u +1,seq = v)包,同时带上自己的序列号:seq = v。此时,服务器就进入了 CLOSE_WAIT 关闭等待状态。
(2)客户端接收到服务器的确认回复的ACK后,此时客户端就进入了 FIN_WAIT_2(终止等待2)状态,等待服务器发送释放连接的报文(但是在这之前仍需要接收服务器发送过来的数据)。
与此同时,TCP服务器通知高层的应用进程,客户端已经没有数据要向服务器发送了,但是服务器如果要发送数据,客户端依然要等待接收。这个等待的状需要持续的这段时间,也就是整个CLOSE_WAIT状态持续的时间。

第三次挥手:服务器将最后的数据发送完毕后,就向客户端发送连接释放报文 FIN=1(ack=u+1),
由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq = w,此时服务器就进入了 LAST-ACK(最后确认)状态,等待客户端的确认。

第四次挥手
(1)客户端收到服务器的连接释放报文后,必须发出确认,ACK = 1,ack = w + 1,而客户端自己的序列号是 seq = u + 1,此时客户端就进入了TIME-WAIT(时间等待)状态。注意:此时TCP连接还没有释放,必须等待 2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
(2)此时服务器只要收到了客户端发出的确认ACK,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

常见面试题
【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
【问题3】为什么不能用两次握手进行连接?
【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?

参考链接:https://blog.csdn.net/qq_38950316/article/details/81087809

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值