zoukankan      html  css  js  c++  java
  • 【计算机网络学习笔记】TCP三次握手与四次挥手

    TCP报文格式

     

    • 源端口与目的端口字段:端口就是运输层与应用层的服务接口,运输层的一些功能要通过端口才能够实现。
    • 序号字段TCP连接在传送数据流的时候,每一个字节都有一个序号,序号字段的值就是报文段中发送的数据的第一个字节的序号。
    • 确认号字段:期望收到对方下一个报文段的数据的第一个字节的序号。
    • 4位首部长度:表示TCP报文段的数据起始处距离TCP报文段的起始处有多远。
    • 保留字段:保留为以后使用。
    • URG,紧急比特:告诉系统报文段中有紧急的数据。
    • ACK,确认比特:向另外一个主机发送确认消息。
    • PSH,推送比特:接收到这个消息后,尽快交给接收应用进程,不需要等到缓存满了之后在向上交付。
    • RST,复位比特:连接中出现严重的差错,必须释放连接,然后重新建立连接。
    • SYN,同步比特:表示一个连接请求。
    • FIN,终止比特:表示报文段的发送端的数据已经发送完毕,要求释放连接。
    • 窗口字段:控制对方发送的数据量,单位是字节。
    • 紧急指针:指出本报文段的紧急数据的最后一个字节的序号。
    • 选项字段TCP只规定了一种选项,最大报文长度MSS,告诉对方自己的缓存能够接收的报文段的最大长度是MSS和字节。
    • 填充字段:为了使得首部长度是4的倍数。

    TCP三次握手与四次挥手

    • TCP协议是一种面向连接的安全可靠的传输协议,在正式传输数据之前必须通过三次握手来进行连接并且交换窗口大小,在传输完成之后,通过四次挥手来确认双方都结束了数据的交互。
    • 滑动窗口TCP协议可以采用大小可变的滑动窗口来进行流量控制,窗口的单位是字节。在TCP报文的窗口字段中填写的数值就是给对方设置的发送窗口数值的上限,发送窗口在连接建立的时候由双方协定,但是在通信的过程中接收方可以根据自己的资源情况,随时动态的调整对方的发送窗口上限值。

    TCP三次握手

    • TCP协议是一种面向连接的安全可靠的传输协议,三次握手机制是为了能够建立一个安全可靠的连接。
    • 第一次握手:由客户端发起,客户端想要给服务端发送一个报文:SYNseq=x服务端接收到报文以后知道客户端想要建立一个新的连接。
    • 第二次握手:服务端向客户端发送一个确认消息:ACK,seq=y, ack=x+1,这次握手之后对于客户端来说已经知道了所有的消息,既可以向服务端发送消息,也可以接收服务器端的消息。
    • 此时,对于服务端来说,两次握手是不够的,服务端只知道自己能够接收到客户端发来的消息,但是不知道自己发出的消息客户端是否能够收到,所以需要第三次握手。如果只是进行了两次握手,那么在工作的时候服务端就可能不知道客户端有没有接收到自己的信息进而一直发送消息,一直处于工作状态,这样就会造成资源的浪费。
    • 第三次握手:客户端发送确认消息:ACK,seq=x+1,ack=y+1,这个时候服务端接收的消息以后,双方都可以知道所有的信息,二者都可以正常发送消息和接收消息。

    TCP四次挥手

    • 四次挥手机制可以结束TCP连接。
    • 第一次挥手:客户端发起一个结束连接的报文:FIN,seq=x,服务端接收到报文以后知道了客户端想要结束连接,但是服务端此时可能种种原因还不能结束连接,例如:消息还没有发送完毕等,所以此时服务端先发送一个确认消息告诉客户端自己接收到了消息。
    • 第二次挥手:服务端发送确认消息:ACK,seq=y,ack=x+1,告诉客户端自己接收到了断开连接的报文。
    • 第三次挥手:过了一段时间,服务端追备好了断开链接,就发送断开连接的确认消息:FIN,seq=y,ack=x+1,表示服务端已经做好了断开连接的准备。
    • 第四次挥手:客户端接收到断开连接确认消息以后,就可以确定服务端做好了准备,那么此时还需要发送一个确认消息:ACK,seq=x+1,ack=y+1,表示自己收到了断开连接的消息,目前位置客户端和服务端都做好了断开连接的准备。

     TCP四次挥手中,主动关闭方最后为什么要等待2MSL之后才能关闭连接?

    • 在客户端收到确认消息以后,发送确认信息,此时客户端到服务端的如果立即关闭,那么客户端将不能在发送数据。然后服务端在接收到确认消息以后也将关闭连接,此时服务端到客户端的连接也将关闭。此时就出现了一个问题,客户端是不知道服务端是否接收到了关闭连接的确认消息,那么要如何知道服务端已经接收到了关闭连接的确认消息呢?这种情况客户端就需要等待,如果确认消息没有发送到服务端,那么服务端就会为FIN这个消息进行超时重传,客户端如果等待的时间够长就可以再次收到FIN消息,此时就说明服务端没有收到确认消息,于是就可以再次发送确认消息,直到在一定的时间内没有接收到FIN消息,说明服务端成功接收到了确认消息,双方都可以关闭连接。这个时间最少是:超时重传时间 + FIN传输时间,采用保守的等待时间就是2MSL

  • 相关阅读:
    字典dict
    数组处理
    switch语句
    java基础复习2
    位运算
    内存中占用的字节
    java基础复习
    常用快捷键
    利用Typora设计博客的方式
    java数据结构-排序算法-堆算法
  • 原文地址:https://www.cnblogs.com/zut-syp/p/14460472.html
Copyright © 2011-2022 走看看