TCP三次握手和四次挥手

📝TCP什么是TCP?

1、TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。
2、TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)

📝TCP三次握手发生在哪里?

  • 如果网络体系按照OSI模型划分为七层,三次握手发生在中间的传输层!

    起承上启下的作用,建立端到端的连接,如客户端–服务器端

在这里插入图片描述

  • ip地址

    客户端和服务器端都有各自的IP地址

客户端和服务器端虽然都有IP地址可以获得联系,但是客户端和服务器端都有各自的应用进程,而且都有可能进行TCP连接,像同时电脑同时用谷歌或者火狐登录B站,B站需要把内容分发给两个不同的应用进程
  • 除了IP地址以外需要什么参数才能保证内容不会错发给应用进程呢?

    端口号

    访问b站时处理IP地址浏览器还会自动添加上端口号443-->https协议
    
    给火狐和谷歌分配不同端口号,像管道一样进行固定的传输
    
  • 握手前的核心条件

    IP地址+端口号=套接字scoked
    

在这里插入图片描述

📝TCP什么是三次握手?

​ 在网络数据传输中,传输层协议TCP(传输控制协议)是建立连接的可靠传输,TCP建立连接的过程,我们称为三次握手。

  • 举个栗子

在这里插入图片描述

  • 流程
1: 客户端发送SYN报文,将序号8633发送给服务器端

	- 序号(Sequence number)随机生成,作为初始值进行后续判断依据,保证通道的唯一性,
	- 如果没有初始序号就会出现,客户端发送两次请求,服务器懵逼,不知道服务器想要干嘛

2: 服务端接受到信号,发送SYN和ACK报文 , 将序列号变为确认号8633+1和随机序号303发送给客户端

	- 客户端接受到确认号-1,就知道是不是自己发送的报文了
	- 如果这一步发送成千上百亿次攻击会这么样---->DDOS攻击了解一下

3: 客户端接受到信号,发送ACK报文,将序号8633+1(对方的确认号+1)和确认号303+1(对方的序列号+1),发送到服务器端

	- 必要的,因为客户端不发送这条信号,服务器就不知道自己发送的"确认同步"是否被接收
	- 如果只有两次握手 这个时候客户端没有回应,这样会浪费服务端的资源


📝TCP的三次握手一定能保证传输可靠吗?不能

三次握手比两次更可靠,但也不是完全可靠,而追加更多次握手也不能使连接更可靠了。因此选择了三次握手。
世界上不存在完全可靠的通信协议。从通信时间成本空间成本以及可靠度来讲,选择了“三次握手”作为点对点通信的一般规则。

小结:

三次握手的关键是要确认对方收到了自己的数据包,这个目标就是通过“确认号(Ack)”字段实现的。计算机会记录下自己发送的数据包序号Seq,待收到对方的数据包后,检测“确认号(Ack)”字段,看Ack = Seq + 1是否成立,如果成立说明对方正确收到了自己的数据包。

📝TCP握手之后,下一步呢?分手吗?

在这里插入图片描述

📝什么是四次挥手?

在网络数据传输中,传输层协议断开连接的过程我们称为四次挥手
  • 再举个栗子

    在这里插入图片描述

  • 流程

1:Clien发送FIN,将序列号和确认号发送给Server

	- 用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

2:Server收到FIN后,发送ACK,将序号和确认号发送给Client

	- Server进入CLOSE_WAIT状态。

3: Server发送FIN,将序列号和确认号发送给Client

	-用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

4:Client收到FIN后,将序列号和确认号发送给Server
	- Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成四次握手。
  • 过程描述
客户端:“我要回家吃饭啦!”
服务器端:“等下,饭快做好了。”
服务器端:“饭做好了,快回来”
客户端:“ok!马上开飞机回来”
  • 注意:
如果连接不能正常断开,不仅会造成数据传输错误,还会导致套接字不能关闭,持续占用资源,如果并发量高,服务器可能原地裂开。

📝为什么连接的时候是三次握手,关闭的时候却是四次握手?

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

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


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值