TCP&IP的三次握手和四次挥手

TCP 三次握手建立连接
所谓三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个报文。

三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。

三次握手过程的示意图如下:

在这里插入图片描述

 其中:

(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(简单说就是客户端和服务器端各自发起时用来计数的!)

(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(这个就是接收方收到信号后确认用的,它的序号和发起序号有关的!接收到信号之后,先把ACK置1,才能产生小写的ack。不要将确认序号ack与标志位中的ACK搞混了。)

(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,比如:

ACK:确认序号有效。
FIN:释放一个连接。

SYN:发起一个新连接。

SYN:发起新链接,看图,一般就刚开始一端出现一个,后面只要不产生新的连接就不会再有了。seq:他等于x是因为它的起始序列是随机的。但是再往后的客户方的起始序列都在它的基础上+1。服务器端的起始序列同理。
注意他俩的起始序列是两个不同的数值概念。
ACK:收到就标志为1,然后就把小写的ack确认序号根据发起方的序列号确定下来。

从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的,这也是面试常问的题。

第一次握手:
客户端将TCP报文标志位SYN置为1,随机产生一个序号值seq=J,保存在TCP首部的序列号(Sequence Number)字段里,指明客户端打算连接的服务器的端口,并将该数据包发送给服务器端,发送完毕后,客户端进入SYN_SENT状态,等待服务器端确认。

第二次握手:
服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将TCP报文标志位SYN和ACK都置为1,ack=J+1,随机产生一个序号值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。

第三次握手:
客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

四次挥手:

在这里插入图片描述

FIN:释放一个连接。
ACK:确认序号有效。

(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(简单说就是客户端和服务器端各自发起时用来计数的!)

(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(这个就是接收方收到信号后确认用的,它的序号和发起序号有关的!接收到信号之后,先把ACK置1,才能产生小写的ack。不要将确认序号ack与标志位中的ACK搞混了。)

有没有发现,这张图的服务器端连着两次返回返回了信号,为啥?

因为服务器端正在运行,你突然过来说要关停,需要人家把手头的后续工作做完。第一次应答是说它知道要关了,第二次应答是手头的事情做完了,真正的关掉了!当然服务器也可以发起关停,反过来同理!

这也是为什么连接的时候三次就可以,而关闭的时候需要四次,因为关闭的时候要确保各自都把手头最后的工作处理结束!

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP设有一个保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大家好我是覃同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值