网络——TCP(三次握手与四次挥手详解)

一、TCP/IP协议

之前一直以为TCP/IP协议应该就是指这两种协议,然后发现并不是这样…

一般来说,TCP/IP是利用IP进行通信时所必须用到的协议群的统称。
具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。
TCP/IP 一词泛指这些协议,因此,有时也称 TCP/IP 为网际协议群

网络——TCP(三次握手与四次挥手详解)_第1张图片

二、TCP

1、TCP报文格式

网络——TCP(三次握手与四次挥手详解)_第2张图片

了解一下TCP头部信息字段

  • 源端口、目的端口
    各占2个字节,端口是传输层和应用层的服务接口,用于寻找发送端和接收端的进程。
    一般来讲,通过端口号和IP地址,可以唯一确定一个TCP连接,在网络编程中,通常被称为一个socket接口。
  • 序号(seq)
    占4字节,用来标识从TCP发送端向TCP接收端发送的数据字节流。
  • 确认序号(ack)
    占4字节,包含发送确认的一端所期望收到的下一个序号,因此,确认序号应该是上次已经成功收到数据字节序号加1
  • 数据偏移
    占4位,用于指出TCP首部长度,若不存在选项,则这个值为20字节,
    数据偏移的最大值为60字节。
  • 保留字段
    占6位,值全为0,为了将来定义新的用途而保留。
  • 标志位
    • URG(紧急) : 为1时表明紧急指针字段有效
    • ACK(确认):为1时表明确认号字段有效
    • PSH(推送):为1时接收方应尽快将这个报文段交给应用层
    • RST(复位):为1时表明TCP连接出现故障必须重建连接
    • SYN(同步):在连接建立时用来同步序号。
      当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1。
    • FIN (终止): 为1时表明发送端数据发送完毕要求释放连接
  • 接收窗口
    占2个字节,用于流量控制和拥塞控制,表示当前接收缓冲区的大小。
    在计算机网络中,通常是用接收方的接收能力的大小来控制发送方的数据发送量。
    TCP连接的一端根据缓冲区大小确定自己的接收窗口值,告诉对方, 使对方可以确定发送数据的字节数。
  • 校验和
    占2个字节,范围包括首部和数据两部分。
    检验和覆盖了整个的TCP报文段:这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证的。
  • 选项
    长度不定,但长度必须为1个字节。如果没有选项就表示这个1字节的域等于0。
    是可选的,默认情况是不选。

2、TCP编程步骤

网络——TCP(三次握手与四次挥手详解)_第3张图片

3、三次握手

  • 图示
    网络——TCP(三次握手与四次挥手详解)_第4张图片
  • 三次握手过程
    • 客户端发起,第一次握手时,SYN=1,客户端发起第一次握手后,处于SYN-SENT状态。
    • 服务端接收到消息后,发起第二次握手,SYN=1,ACK=1,服务端发出握手后处于SYN-RCVD状态。
    • 客户端接收到服务端连接,发起第三次握手,ACK=1,客户端发出握手后处于ESTAB-LISHED状态,服务端接收到第三次握手消息后处于ESTAB-LISHED状态就可以进行双向通信。
4、四次挥手
  • 图示
    网络——TCP(三次握手与四次挥手详解)_第5张图片

  • 四次挥手的过程

    • 客户端主动发起挥手过程,FIN=1,客户端发出挥手后处于FIN-WAIT-1状态。
    • 服务端接收到挥手消息后,发起第二次挥手,ACK=1,服务端处于CLOSE-WAIT状态
    • 客户端接收到第二次挥手消息后,处于FIN-WAIT-2状态,即客 户端不能给服务端发送消息,服务端可以给客户端发送消息(全双工-单向通行)
    • 客户端发起第三次挥手,FIN=1,ACK=1,服务端处于LAST-ACK状态
    • 客户端接收到服务端挥手消息,发起第四次挥手,ACK=1,客户端处于TIME-WAIT状态
    • 服务端接收到客户端挥手消息,即进入close状态,客户端在2MSL时间后由YIME-WAIT状态进入到CLOSE状态

5、数据可靠性的体现

  1. 数据通信前进行连接,通行结束释放连接。
  2. 保证数据完全达到目的端:确认应答机制和超时重传机制。
  3. 接收方接收的数据都是有序的,在发送数据头部的序号+数据的大小,就可以确定数据的位置以及下一次接收数据的起始位置。
  4. 数据的发送和接收是完全相同的,通过头部的校验和字段来判断接收数据是否存在损坏,存在损坏则丢弃重新接收客户端的发送。

6、滑动窗口机制

滑动窗口就是一种流量控制技术。

它本质上是描述接收方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据,如果发送方收到接收方的窗口大小为0的TCP数据报,那么发送方将停止发送数据,等到接收方发送窗口大小不为0的数据报的到来。

  • 已发送并被确认:数据流中最早的字节已经发送并得到确认。这些数据是站在发送设备的角度来看的。

  • 已发送但未被确认: 已发送但尚未得到确认的字节。发送方在确认之前,不认为这些数据已经被处理。

网络——TCP(三次握手与四次挥手详解)_第6张图片

7、常见问题

  • 为什么客户端最后还要等待2MSL?

第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

  • 为什么建立连接是三次握手,关闭连接确是四次挥手呢?

建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

你可能感兴趣的:(网络,TCP报文格式,三次握手,四次挥手,TCP编程,滑动窗口机制)