02 ,tcp 原理 : 三次握手,数据传输,四次挥手

1 ,建立连接 : 三次握手 ( 图示 )

  1. 图示 :
    02 ,tcp 原理 : 三次握手,数据传输,四次挥手
  2. 6 个标志位 :
    1 ,URG:紧急指针标志,当为 1 时表示紧急指针有效,为 0 则忽略紧急指针
    2 ,ACK:确认序号标志,为 1 表示确认号有效,为0表示报文中不含有确认信息,确认号无效
    3 ,PSH:push 标志,当为 1 时就是让接收方收到该TCP报文的时候不进入缓冲区排队而是快速发给应用程序
    4 ,RST:重置连接标志,当连接出现错误时可以重置,或者用于拒绝非法的报文段和连接请求
    5 ,SYN:同步序号,用于建立连接过程
    6 ,FIN:finish 标志,用于释放连接

2 ,建立连接 : 三次握手 ( 详解 )

  1. 第一次握手:当客户端需要去建立连接时,客户端就会发送SYN包(seq=x)到服务器,然后客户端进入SYN_SEND的状态,代表已经发SYN包过去,并且在等待服务器确认。此时ACK=0,SYN=1.,这时候由于才第一次握手,所以没有ACK标志
  2. 第二次握手:服务器收到SYN包,就会进行确认,由上面的标志位介绍我们可以知道SYN是表示同步序号,这时候会使得确认号=序号+1,即ack就会等于x+1,然后服务器也会像客户端发送一个SYN包(seq=y),这时候也就是服务器会发送SYN+ACK包,来表示服务器确认到了客户端的一次握手并且二次握手建立,此时服务器进入SYN_RECV状态。此时SYN=1,ACK=1,这时候由于是第二次握手,所以就会有一个服务器给客户端的确认标志。
  3. 第三次握手:客户端收到服务器的SYN+ACK包,然后就会像服务器发送确认包ACK(ack=k+1)和SYN(seq=x+1),等到这个包发送完毕之后客户端和服务器就会进入ESTABLISHED状态,完成三次握手,而后就可以在服务端和客户端之间传输数据。此时SYN标志位已经不需要,因为当我们发送ACK标志位的时候代表三次握手成功,已经建立完连接了,接下来可以传送数据过去了。

3 ,建立连接 : 三次握手 ( 总结)

  1. 前提 : 服务器打开,可以被连接
  2. 第一次握手 :
    1 ,客户端发消息给服务器,我是否可以连接你?
    2 ,服务器说,可以。
  3. 第二次握手 :
    1 ,服务器说,可以,我可以连接你吗?
    2 ,客户端说,可以,然后那个绳子,把自己连上了,准备用绳子互相传东西。
  4. 第三次握手 :
    1 ,客户端说,可以,我已经准备好了,你也准备一下吧。
    2 ,服务端知道客户端准备好了,将绳子的另一头连到自己这边,主备互相传东西

4 ,传输数据过程 :

  1. 超时重传: 超时重传机制用来保证TCP传输的可靠性。每次发送数据包时,发送的数据报都有seq号,接收端收到数据后,会回复ack进行确认,表示某一seq号数据已经收到。发送方在发送了某个seq包后,等待一段时间,如果没有收到对应的ack回复,就会认为报文丢失,会重传这个数据包。

  2. 快速重传: 接收数据一方发现有数据包丢失了,就会发送ack报文告诉发送端重传丢失的报文。如果发送端连续收到标号相同的ack包,则会触发客户端的快速重传。比较超时重传和快速重传,可以发现超时重传是发送端在等超时,然后触发重传;而快速重传则是接收端主动告诉发送端数据没收到,然后触发发送端重传。

  3. 流量控制: 这里主要说TCP滑动窗流量控制,与网络无关。TCP头里有一个字段叫window,也就是advertised-window,这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会到时接收端处理不过来。滑动窗可以是提高TCP传输效率的一种机制。

  4. 拥塞控制: 滑动窗用来做流量控制。流量控制只关注发送端和接收端自身的状况,而没有考虑整个网络的通信状况。拥塞控制则是基于整个网络来考虑的。如果某一时刻网络上的延时突然增加,那么 TCP对这个事做出的应对只有重传数据,但是 重传会加重网络负担,所以会导致更大的延迟以及更多的包丢失,于是这个情况就会进入一个恶性循环,试想一下,如果一个网络内有成千上万的TCP连接都这样,那么TCP这个协议就会拖垮整个网络。所以 TCP引入了拥塞控制策略。拥塞控制策略算法主要包括:慢启动,拥塞避免,拥塞发生,快速恢复。

5 ,断开连接 : 四次挥手

  1. A发送一个FIN(连接释放请求),用来关闭A方到B方的数据传送,也就是A告诉B我不会再给你发送数据了,但此时B还可以接受数据。此时A进入FIN_WAIT状态。
    FIN=1,表示释放连接。
    seq=u,u-1表示确认的最后一个数据序号。

  2. B收到FIN(连接释放请求)后,发送一个ACK(应答响应)给对方,确认序号为收到序号+1;此时B进入CLOSE_WAIT状态。
    ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答。
    seq= v:v-1是B向A发送的最后一个字节的序号。
    ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。

  3. B发送一个FIN(连接释放请求),用来关闭B到A的数据传送, B便进入LAST-ACK状态。

  4. A收到FIN(连接释放请求)后,向B发送ACK确认应答,此时A进入TIME-WAIT状态。完成第四次挥手。

  5. 图解 :
    02 ,tcp 原理 : 三次握手,数据传输,四次挥手