TCP的三次握手

TCP三次握手

1.TCP和UDP

首先我们需要了解一下TCP和UDP这个两个重量级的传输层协议

  • 用户数据报协议UDP(User Datagram Protocol):
    UDP在传输数据之前不需要先建立连接,远程主机在收到UDP报文之后,不需要给出任何确认
  • 虽然UDP不可提供可靠交付,但在某些情况下,UDP往往会更加高效(一般用于即时通讯),比如:QQ语音、QQ视频、直播等

**传输控制TCP(Transmission Control Protocol):

  • TCP提供面向连接的服务。在传输数据之前必须先建立连接,数据传送结束后要释放连接。
  • TCP不提供广播或多播服务。由于TCP要提供可靠的,面向连接的数据传输服务(TCP的可靠体现TCP和传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、超时重传、流量控制,拥塞控制机制,在数据传完后,还会四次回收断开用来的节约系统资源)。这不仅时协议数据的内容大很多,还要占用许多处理资源。
  • TCP一般用于文件传输、发送和接受邮件,远程登录等场景。

TCP报文段首部格式

TCP报文段的具体格式不必全部记住,但其中的几个控制与我们要讲的三次和四次握手息息相关。

1

首部固定部分字段意义如下:

  • 源端口和目的端口:各占两个字节,分别写在源端口和目的端口。IP地址+端口号就可以确定一个进程地址
  • 序列号(Sequense Number,SN):在一个TCP连接中传送的字节流中的每个字节都按顺序排序编号。该字段表示本报文段所发送的数据第一个字节的序号,初始化号称为Init Sequense Number,ISN(序列号这个字段很重要,例如,一报文段的序号是101,共有100字节的数据。这就表明:本报文段的数据的第一个字节的序号是101,最好一个字节的序号是200.显然,下一个报文段的数据序号应当从201开始,即下一个报文段的序号字段值位201)
  • 确认号ack:期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则表明:到序号N-1为止的所有数据都已正确收到
  • 数据偏移(首部长度):它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。
  • 保留:占6位,应置为0,保留为今后使用。

在上图中,保留位的右边还有6个控制位,这是TCP用来说明该报文段性质的:

  • 紧急位URG:当URG=1时,表明此报文段中有紧急数据,是高优先级的数据,应尽快发送,不用在缓存中排队。该控制位需配合紧急指针使用(紧急指针指出本报文文段中锦集数据的字节数)

    举个例子:我们需要取消一个已经发送了很长程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据,那么这个指令将存储在接受TCP的缓存末尾,只有在所有的数据被处理完毕后这两个字符才交付接受方的应用进程,这样做就无法实现立即中断。

  • 确认ACK:仅当ACK=1时确认号字段才有效,当ACK=0时确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1。

  • 推送PSH:当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地交付接受应用进程。而不用等到整个缓存都填满了后再向上交付。

  • 复位RST:当RST=1时,表明TCP连接中出现了严重错误(如由于主机崩溃或者其他原因),必须释放连接,然后重新建立传输连接。

  • 同步SYN:SYN=1表示这是一个连接请求或者连接接受报文。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1且ACK=1。

  • 终止FIN:用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。

三次握手过程

三次握手的原文是three-way handshake,整个名词的可以翻译为:需要三个步骤才能建立握手/连接的机制。当然三次握手也被称为three-message handshake,通过三个消息来建立的握手/连接

进行三次握手的主要作用就是为了确认双方的接受能力和发送能力是否正常、指定自己的初始化序列号(Init Sequense Number,ISN)为后面的可靠性传输做准备。

如下图所示:

2

图中字符的含义:

  • SYN:连接请求/接受 报文段
  • seq: 发送的第一个字节的序号
  • ACK:确认报文段
  • ack: 确认好,希望收到的下一个数据的第一个字节的序号

刚开始客户端处于closed状态,而服务端处于Listen状态:

CLOSED:没有任何连接状态

LISTEN:侦听远方TCP端口的连接请求

第一次握手:客户端向服务端发送一个SYN报文(SYN=1),并指明客户端的初始化序列号ISN(x),即图中的seq=x,表示本报文端所发送的数据的第一个字节的序号。此时客户端处于SYN_Send状态。

SYN-SENT:在发送连接请求后等待匹配的连接请求

第二次握手:服务器收到客户端的SYN报文之后,会发送SYN报文作为应答(SYN=1),并且指定自己的初始化序列号ISN(y),即图中的seq=y。同时会把客户端的ISN+1作为确认好ack的值,表示已经收到了客户端发来的SYN报文,希望收到的下一个数据的第一个字节的序号是x+1,此时服务器处于SYN_REVD的状态

SYN-RECEIVED:在收到和发送一个连接请求后等待对连接请求的确认

第三次握手:客户端收到服务器端响应的SYN报文之后,会发送一个ACK报文,也是一样把服务器的ISN+1作为ack的值,表示已经收到了服务端发来的SYN报文,希望收到的下一个数据的第一个字节的序号是y+1,并指明此时客户端的序列号seq=x=1(初始为seq=x,所以第二个报文段要+1),此时客户端处于Estalised状态。

服务器收到ACK报文之后,也处于Establised状态,至此,双方建立起了TCP连接

ESTABLITSHED:代表一个打开的连接,数据可以传送给用户

为什么要三次握手?

三次握手的目的是建立可靠的通信通道,说到通讯,简单来讲就是数据的发送与接受,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。

只有经过三次握手才能确认双发的收发功能都正常,缺一不可:

  • 第一次握手(客户端发送SYN报文给服务器,服务器接收到该报文):客户端什么都不能确认;服务器确认了对方发送正常,自己接受正常。

  • 第二次握手(服务器响应SYN报文给客户端,客户端会接受该报文):
    客户端确认了:自己发送、接收正常,对方发送,接受正常;

    服务器确认了:对方发送正常,自己接受正常

  • 第三次握手(客户端发送ACK报文给服务器):

    客户端确认了:自己发送、接受正常、对方发送、接受正常;
    服务器确认了:自己发送、接受正常、对方发送、接受正常

ISN(Inital Sequence Number)是固定的吗?

三次握手的其中一个重要功能是客户端和服务端交换ISN(Inital Squence Number),以便让对方接下来接受数据的时候如何按照序列号组装数据

当一端为建立链接而发送它的SYN时,它会为链接选择一个初始化序号。ISN随时间而变化,因此每个连接都将具有不同的ISN。如果ISN是固定的,攻击者很容易猜出后续的序列号,因此ISN是动态生成的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值