TCP三次握手与四次挥手

一:英语解释

Client: 客户端

Server: 服务端

CLOSED: 关闭,表示主机的连接处于关闭状态。

LISTEN: 监听,表示主机处于监听状态,等待被连接。

SYN: Synchronize Sequence Numbers,同步序列编号。是TCP/IP建立连接时使用的握手信号。

SYN_SEND: Synchronize Sequence Numbers Send,同步序列号已发送。

SYN_RCVD: Synchronize Sequence Numbers Send Received,同步序列号已接收。

ACK: Acknowledge character,确认字符,表示发来的数据已确认接收无误。

ESTABLISHED: 已经建立连接,TCP:连接成功。

FIN_WAIT: Finish Wait,终止等待,请求关闭连接。是TCP/IP关闭连接时使用的挥手信号。

CLOSE_WAIT: 关闭等待,会被动关闭连接。

TIME_WAIT: 时间等待,会主动关闭连接。

LAST_ACK: Last Acknowledge character,最后的确认,确认后,TCP:连接关闭。

二:半连接池

客户端发送请求后,服务端会先将SYN请求放进半连接池。

如果半连接池只能存放5个SYN请求,那么第6个SYN请求会无法进入。

在连接池内的SYN请求并不会马上获得响应,而是像队列一样,先进先出,一个一个地获得服务端的回应。

2.1、三次握手与四次挥手

TCP通过三次握手建立可靠连接。

image-20201115141413987

  • TCP是一种可靠的,面向连接的全双工传输层协议。TCP连接的建立是一个三次握手的过程。如图所示︰

  • 主机A(通常也称为客户端,处于SYN_SEND状态)发送一个标识了SYN的数据段,表示期望与 接,此数据段的序列号( seq )为a。

  • 服务器A(SYN_RECV接收状态)回复标识了SYN+ACK的数据段,此数据段的序列号( seq )为b,确认序列号为主机A的序列号加1 ( a+1 ),以此作为对主机A的SYN报文的确认。

  • 主机A发送一个标识了ACK的数据段,此数据段的序列号( seq)为a+1,确认序列号为服务器A的序列号加1(b+1),以此作为对服务器A的SYN报文的确认;进入Established状态。

    三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

2.2、通俗版本:

背景:A区和B区中间要建立开发区了,需要拆除高速公路

①A区:我是A区 我高速公路上的车辆都清空了,我要拆高速公路了

②B区:好的,你拆吧!我还没清空车辆

③B区:我是B区,我高速公路上的车辆也清空了,我要拆高速公路了

⑤A区:好的,你拆吧!

三、数据传输

image-20201115141815812

  • TCP的可靠传输还体现在TCP使用了确认技术来确保目的设备收到了从源设备发来的数据,并且是准确无误的。
    确认技术的工作原理如下︰

  • 目的设备接收到源设备发送的数据段时,会向源端发送确认报文,源设备收到确认报文后,继续发送数据段,如此重复。

  • 如图所示,主机A向服务器A发送TCP数据段,为描述方便假定每个数据段的长度都是500个字节。当服务器A成功收到序列号是M+1499的字节以及之前的所有字节时,会以序列号M+1499+1=M+1500进行确认。另外,由于数据段N+3传输失败,所以服务器A未能收到序列号为M+1500的字节,因此服务器A还会再次以序列号M+1500进行确认。

image-20201115141902749

  • TCP滑动窗口技术通过动态改变窗口大小来实现对端到端设备之间的数据传输进行流量控制。

  • 如图所示,主机A和服务器A之间通过滑动窗口来实现流量控制。为方便理解,此例中只考虑主机A发送数据给服务器A时,服务器A通过滑动窗口进行流量控制。

  • 主机A向服务器发送4个长度为1024宁节的数据段,其中主机的窗口大小为4096个字节。服务器A收到第3个数据段后,缓存区满,第4个数据段被丢弃。服务器以ACK 3073响应,窗口大小调整为3072,表明服务器的缓冲区只能处理3072个字节的数据段。于是主机A改变其发送速率,发送窗口大小为3072的数据段。

image-20201115141942915

主机在关闭连接之前,要确认收到来自对方的ACK。

  • TCP支持全双工模式传输数据,这意味着同一时刻两个方向都可以进行数据的传输。在传输数据之前,TCP通过三次握手建立的实际上是两个方向的连接,因此在传输完毕后,两个方向的连接必须都关闭。

TCP连接的建立是一个三次握手的过程,而TCP连接的终止则要经过四次握手。如图所示∶

  • 主机A想终止连接,于是发送一个标识了FIN,ACK的数据段,序列号为a,确认序列号为b;进入Fin_wait状态.

  • 服务器A回应一个标识了ACK的数据段,序列号为b,确认序号为a+1,作为对主机A的FIN报文的确认;进入close_wait状态。

  • 服务器A过了一会儿数据传输完毕也想终止连接,于是向主机A发送一个标识了FIN,ACK的数据段,序列号为b,确认序列号为a+1;进入last_ack状态。

  • 主机A回应一个标识了ACK的数据段,序列号为a+1,确认序号为b+1,作为对服务器A的FIN报文的确认。

  • 以上四次交互便完成了两个方向连接的关闭。

百度结果:

其中比较重要的字段有:

(1)序号(sequence number):Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

(2)确认号(acknowledgement number):Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。

(3)标志位(Flags):共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:

  • URG:紧急指针(urgent pointer)有效。
  • ACK:确认序号有效。
  • PSH:接收方应该尽快将这个报文交给应用层。
  • RST:重置连接。
  • SYN:发起一个新连接。
  • FIN:释放一个连接。

需要注意的是:

不要将确认序号Ack与标志位中的ACK搞混了。
确认方Ack=发起方Seq+1,两端配对。

首部格式

TCP的首部格式如图1所示:

图1 TCP首部 图1 TCP首部

---Source Port是源端口,16位。

---Destination Port是目的端口,16位。

---Sequence Number是发送数据包中的第一个字节的序列号,32位。

---Acknowledgment Number是确认序列号,32位。

---Data Offset是数据偏移,4位,该字段的值是TCP首部(包括选项)长度除以4。

---标志位: 6位,URG表示Urgent Pointer字段有意义:

ACK表示Acknowledgment Number字段有意义

PSH表示Push功能,RST表示复位TCP连接

SYN表示SYN报文(在建立TCP连接的时候使用)

FIN表示没有数据需要发送了(在关闭TCP连接的时候使用)

Window表示接收缓冲区的空闲空间,16位,用来告诉TCP连接对端自己能够接收的最大数据长度。

---Checksum是校验和,16位。

---Urgent Pointers是紧急指针,16位,只有URG标志位被设置时该字段才有意义,表示紧急数据相对序列号(Sequence Number字段的值)的偏移。

本篇参考:网络协议篇:https://www.cnblogs.com/bbdbolg/p/14167072.html +百度结果+博主:http://www.xuexianqi.top/archives。

posted @ 2020-11-16 08:49  只有时间是永恒  阅读(213)  评论(0编辑  收藏  举报