TCP连接三次握手,四次挥手

关于TCP/IP方面的内容,都是理论性比较强的知识,基本很难通过通俗易懂的语言进行描述,如果想要学习这方面知识,刚开始确实有一定难度,因为将要面对的都是一大堆理论术语,确实非常枯燥,但是熬过刚开始的一段时间,入了门之后,再往后学习就简单多了。
现在人们的生活都离不开网络,但是网络中信息到底是怎么传输的,对于大部分人来说,还是陌生的,神秘的,如果把互联网比作一个带着面纱的美女,那我们学习网络知识,就是在一步步揭开面纱的过程,过程不简单,但是能一睹绝世容颜也是值得的。

TCP、UDP协议是网络七层结构中位于传输层的两个重要协议,我们能够上网,与这两个协议是密不可分的,比如你现在在看我这篇文章,肯定通过http协议访问CSDN主页,http(s)连接就是基于TCP协议,还有用于文件传输的ftp协议,基于远程登录的Telnet和ssh协议,与电子邮件相关的pop3和IMAP协议等等,均是基于TCP连接。

上述说到的一些功能,http,ftp,Telnet,电子邮件,几乎就涵盖了我们上网所需的全部功能了,刚刚也说了传输层有两个协议,除了TCP还有UDP呢,那这些为啥不用UDP协议呢,UDP比TCP连接速度更快,性能更好,TCP与UDP有什么区别呢?
这个问题随便在网上一搜就有一大堆答案,这里我就不复制粘贴了,就说最核心的一点,TCP比UDP更安全。这就是为啥重要的功能都用TCP而不用UDP的原因。
面试的时候如果只说TCP比UDP更安全,那面试官肯定不买账,肯定要继续问为啥呢?为啥TCP就更安全?这个问题也是这篇博客主要解决的问题。
要回答TCP为啥更安全,就要先搞清楚TCP连接方式,要搞清楚连接方式,要先了解一下TCP报文格式。

TCP报文格式

TCP报文有两部分组成:首部+数据字段
在这里插入图片描述
真正有意义的是数据字段,它是我们要发送给目标主机的值。
TCP报文段首部的前20个字节是固定的,后面有4n字节是根据需要而增加的选项(n是整数),首部是TCP连接安全性的保障,下面来看看TCP首部。
在这里插入图片描述
首先源端口与目的端口,是传输层与应用层的接口
序号字段(SEQ),占32bit,它表示本报文段所发送的第一个字节的序号
确认序号(ACK),表示期望收到的下一个报文段的第一个字节的序号,这里就可以看出来,下一个报文的序号,应该是等于上一个报文的确认序号的,否则TCP校验就不通过。
数据偏移,占4bit,表示TCP数据段与TCP报文起始处的距离,实际上就是表示首部的长度
保留字段,占6位,目前置为0,以后可能会用到
标志位,占6位,含义如下:

  • URG紧急比特:=1表示紧急字段有效,应该尽快传送
  • ACK确认比特(与确认序号一样,也是ACK):=1表示确认字段有效,在连接时必须要把ACK置为1
  • PSH推送比特:=1表示尽快交付应用层使用,无需等待缓存填满在向上交付
  • RST复位比特:=1表示出现严重错误
  • SYN同步比特:=1表示请求或连接接收报文,在建立TCP连接时,需要将此位置1
  • FIN终止比特:=1表示释放连接,在断开连接时置1

窗口字段,占16bit,用于控制对方发送的数据量
检验和,16bit,用户检验首部和数据字段,计算检验和需要在首部前面加上12字节的伪首部
紧急指针,表示本报文段紧急字段的最后一个字节序号,与URG配合使用
选项,长度可变,最长可达4字节。当没有使用“选项”时,TCP的首部长度是20字节。

以上就是TCP报文格式。
TCP连接过程较UDP要复杂,形象一点说就是要经历三次握手,四次挥手,连接阶段要经历三次握手,释放连接经历四次挥手

三次握手

第一次握手:
首先client想server发送一个连接请求(client和server表示两个需要连接的主机,后面不在解释),
SYN=1,发送序号SEQ=x,
此时client进入SYN-SEND状态,等待server响应
第二次握手:
Server接收到标志位SYN=1,表示知道client请求建立连接
SYN=1,ACK=1,确认序号ACK=x+1
随机产生一个发送序号SEQ=y
将该数据包发送给client,以确认连接请求
最后server进入SYN-RCVD状态
第三次握手:
client收到确认后,首先确认ACK是否=x+1,标志位ACK是否=1
然后标志位ACK=1,确认号ACK=y+1,并将报文发送给server
server检查确认序号ACK是否=y+1,ACK是否=1
最后client和server都进入ESTABLISHED状态
在这里插入图片描述
如图,使用netstat -n命令可以查看各端口连接状态
TCP连接过程发送了三次报文,所以讲这个过程又称为三次握手。总结一下
第一次握手client告诉server我想和你么么哒,并摆好姿势(进入SYN-SEND状态),
第二次握手server告诉client我收到你的请求了,并且同意跟你么么哒,同样摆好姿势(进入SYN-RCVD状态),
第三次握手client与server开始么么哒(两者都进入ESTABLISHED状态),此时client和server就可以相互收发数据

四次挥手

四次挥手用于client与server断开连接的过程
第一次挥手:
client断开连接时,发送一个数据包,FIN=1,ACK=1,发送序号SEQ=x,确认序号ACK=y
client进入FIN-WAIT-1状态
第二次挥手:
server收到client的断开请求,发送确认包
标志位ACK=1,SEQ=y,确认序号ACK=x+1
server进入CLOSE_WAIT状态
此时client停止发送数据,但是server可以继续发送数据,此时TCP处于半关闭状态(HALF_CLOSE)
client接收到报文后等待server发送FIN报文,这可能会持续一段时间
第三次挥手:
server断开TCP连接,此时发送一个包,标志位FIN=1,发送序号SEQ=z
server进入LAST_ACK状态
此时目标主机还会发送一些数据,所以SEQ不一定位y+1,因此将其设为z
第四次挥手:
client收到释放报文后,进入TIME_WAIT状态,发送一个确认报文
ACK=1,确认序号ACK=z+1,SEQ=x+1
等待一段时间,确认报文送达之后,client进入CLOSE状态,server接收到报文后同样进入CLOSE状态。

释放连接的过程一共发送四次报文,所以称它为四次挥手过程

以上就是TCP连接和释放连接过程,搞清楚这一点再来看为啥比UDP更加安全

UDP与TCP对比

首先UDP报文的首部结构相比TCP要简单的多,UDP首部由源端口(16bit)和目标端口(16位),长度(16位,表示UDP报文首部与数据字段总长度),校验和(16位,用来对UDP报文校验,有错就直接丢弃报文,不会重新发送,TCP报文出错会重发)四部分组成
其中校验和是可选项,TCP报文的校验和是必选。
理论上两台主机直接发送数据是不需要连接的,只需要源地址,目标地址,源端口,目标端口,就可以进行发送数据,UDP也确实是这样做的,UDP协议不需要建立连接关系,直接可以向目标主机发送数据,发送完数据之后也不会管目标主机到底有没有接收到发送的数据,如果出现错误就直接将数据包丢弃,这样如果底层网络结构不够完善的话就会造成丢包的现象,这是不被允许的。这也是UDP协议不够安全的原因。
所以TCP协议是面向连接,安全的协议,UDP是无连接,不安全的。

那是不是UDP协议就没有用武之地了呢?当然也不是,俗话说上帝为你打开一扇门,同时也会关上一扇窗,TCP协议虽然足够安全,但是传输效率很明显不如UDP,要建立连接关系需要发送三次报文,实际上这三次报文是没有意义的,同样的TCP首部占用几十个字节的数据,这些数据也是没有意义的,这就导致TCP连接为了安全性,牺牲了一部分性能。对于传送数据较少且数据较小的情况,UDP协议会更加高效。
刚刚我也说了,底层网络结构不够完善的情况下,UDP协议会造成丢包的现象,那如果底层网络结构足够完善,足以保证基本的安全性需求呢,那么UDP的优势就会凸显出来了,据传言http3将要基于UDP协议,主要原因也是经过几十年的发展,我们的网络结构早已不在是刚开始的那样很脆弱的状态,已经基本可以保证基本的安全性需求,这时就要往更高性能的方向发展,UDP的优势慢慢变得明显。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值