网络--02TCP/IP协议的深入分析

TCP握手协议

TCP消息的可靠性在数据进行传输前,需要通过三次握手建立一个连接。
建立TCP链接时,需要客户端和服务端总共发送3个包来确认连接的建立,在socket编程中,这个过程由客户端执行connect来触发。
在这里插入图片描述

第 一 次 握 手(SYN=1, seq=x)客 户 端 发 送 一 个TCP的SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号X,保存在 包 头 的 序 列 号(Sequence Number)字段里。发送完毕后,客户端 进 入SYN_SEND 状态。

第 二 次 握 手(SYN=1, ACK=1, seq=y, ACKnum=x+1):服务器发回确认包(ACK)应 答 。即SYN 标志位和ACK 标志位均为1。服务器端选择自己ISN 序列号,放到Seq 域里,同时将 确 认 序 号(Acknowledgement Number)设置为客户的ISN 加1,即X+1。发送完毕后,服务器 端 进 入SYN_RCVD 状态。

第 三 次 握 手(ACK=1,ACKnum=y+1)客户端再次发送确认包(ACK),SYN标志位为0,ACK标志位为1,并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN发完毕后 , 客 户 端 进 入ESTABLISHED 状态,当服务器端接收到这个包时,也进入ESTABLISHED 状态,TCP握手结束。

TCP 在三次握手的时候,IP 层和MAC 层在做什么呢?
TCP 发送每一个消息,都会带着IP 层和MAC 层了。因为,TCP 每发送一个消息,IP 层和MAC 层的所有机制都要运行一遍。而你只看到TCP 三次握手了,其实,IP 层和MAC 层为此也忙活好久了。

SYN攻击?

在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了。

TCP四次挥手协议

四次挥手表示TCP断开连接的时候,需要客户端和服务端总共发送4个包以确认连接的断开;
客户端或服务器均可主动发起挥手动作**(因为TCP是一个全双工协议)**,在socket 编程中,任何一方执行close() 操作即可产生挥手操作。

单工:数据传输只支持数据在一个方向上传输。
半双工:数据传输允许数据在两个方向上传输,但是在某一时刻,只允许在一个方向上传输,实际上有点像切换方向的单工通信
全双工:数据通信允许数据同时在两个方向上传输,因此全双工是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力

第一次挥手(FIN=1,seq=x)

假设客户端想要关闭连接,客户端发送一个FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。发送完毕后,客户端进入FIN_WAIT_1 状态。

第二次挥手(ACK=1,ACKnum=x+1)

服务器端确认客户端的FIN包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。发送完毕后,服务器端进入CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入FIN_WAIT_2 状态,等待服务器端关闭连接。

第三次挥手(FIN=1,seq=w)

服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN置为1。发送完毕后,服务器端进入LAST_ACK 状态,等待来自客户端的最后一个ACK。

第四次挥手(ACK=1,ACKnum=w+1)

客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入TIME_WAIT状态,等待可能出现的要求重传的ACK包。
服务器端接收到这个确认包之后,关闭连接,进入CLOSED 状态。
客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的ACK,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入CLOSED状态。

总结

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,“告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息”。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,“告诉Client端,好了,我这边数据发完了,准备好关闭连接了”。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,“就知道可以断开连接了”。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

问题

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

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

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值