您的位置:首页 > 理论基础 > 计算机网络

TCP建立连接为什么需要三次握手和结束连接为什么需要四次挥手

2018-09-05 20:25 246 查看
版权声明:本文为CSDN原创投稿文章,转载请标明原创地址! https://blog.csdn.net/qq_27046951/article/details/82430182

TCP概述

TCP是运输层的传输控制协议。
TCP提供了一种面向连接的(connection-oriented)、可靠的字节流服务
面向连接是指:使用TCP的两个应用程序必须在它们可交换数据之前,通过相互联系建立一个TCP连接。
TCP提供了全双工通信。TCP允许通信双方在任何时候都能发送数据。TCP连接的两端
都设置有发送缓存和接收缓存,用来临时存放通信双方的数据。

TCP报文段的首部
TCP头部,标准长度为20字节,以32位为单位

  • 源端口和目的端口

    每个TCP头部包含了源端口和目的端口,这和IP头部中的源IP和目的IP一起,
    唯一的标识了每个连接。
    一个IP和端口的组合成为一个套接字(Socket)
    每个TCP连接由一对套接字(客户端的IP和端口以及服务器的IP和端口)唯一的标识
  • 序列号(Sequence number)

    占4个字节 [0,(2^32)-1] ,序列号增加到(2^32)-1后,下一个序号又回到0。
    序列号标识了TCP发送端到接收端数据流的一个字节。
    一个TCP连接传送的字节流中每一个字节都按顺序编号。
    首部中的序列号指的是本报文所发送数据的第一个字节的序列号。
    例如:一报文段的序列号为301,携带的数据有100字节,这就表明该报文段数据
    的第一个字节为301,最后一个字节的序列号为401。
  • 确认号

    ACK中的确认号就是发送这个ACK的一端所期待的下一个序列号。
    即最后被成功接收字节对应的序列号+1.
    B正确的收到A发过来的报文段,其序列号为501,而数据大小为200字节。这个
    报文段的序列号为(501-700),这表明B收到了A发送的序列号到700为止的数据。
    所以B期望下一个报文段的序列号为701.于是B在发送给A的确认报文段中
    将确认号置为701.
  • 窗口

    通知接收方,发送的报文需要多大的空间来接收

    TCP连接的建立(三次握手)

    1、客户端发送一个SYN报文段,并指明自己想要连接服务器IP和端口号
    以及要发送数据的初始化序列号
    2、服务器确认(ACK)客户端发送的SYN,同时自己也要发送SYN报文段和服务器
    要发送数据的初始化序列号。ACK的值为其包含的初始化序列号值加1
    3、客户端确认服务器的SYN。将服务器的初始化序列号加1返回

    为什么是三次握手?A为什么最后还要发送一次确认?

    为了防止已经失效的连接请求报文段又突然传到服务端,因而产生错误。
    A发送的一个连接请求在网络结点的时间滞留,以至于延误到连接释放的某个
    时间才到达B。B收到这个请求的报文段后,误以为A又发出了一次新的请求连接,
    于是向A发送确认报文段,同一建立连接。但是由于A并没有发出新的请求连接,
    所以A不会理睬B的确认也不会向B发送数据。但B却认为连接已经建立,一直
    等待A发来数据。B的资源就白白浪费了。

    如果采用三次握手,B收到失效的报文段后向A发送确认,但是A并没有要求建立连接,就不会向B发送确认,这时候B也就知道请求没有建立。本质原因是信道是不可靠的。
    TCP的连接释放,四次挥手

    1,A发送一个FIN,代表数据发送完毕,其序列号为u,它等于前面已传送数据
    最后一个字节的序列号+1
    2,B收到A的释放报文段后发出确认,确认号ACK=u+1,确认报文段的序列号为v。
    A到B这个方向上的连接就释放了。
    3,B发送释放报文段FIN,B还需要重复上次发送的ACK,B放的报文段序列号为w,
    等待A的确认。
    4,A在收到B的释放报文段后,需要确认。确认号为w+1

    为什么是四次挥手?

    为什么不是三次或者五次?
    因为TCP的通信是全双工通信。
    要实现可靠的连接关闭,A发送结束报文FIN,收到B的确认后。A知道自己没有
    数据要发送,B知道A不再发送数据。但是B还可以发送数据,A还可以接收数据。
    只有当B发送结束报文FIN,收到A的确认后,才算是真正的断开连接。
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: