tcp建立和传送数据及关闭详解总结

                                                           tcp建立和关闭详解总结

一.tcp协议概述

        使用tcp协议通信的双方必需先建立连接,然后开始数据读写,双方必须分配必要的内核资源,

        tcp连接是全双工的,双方的数据读写可以通过一个链接进行,数据交换完成后,双方必须断开连接释放资源               

        保证正确性和错误性,所以有缓存区,用来存要发送的数据(发送缓冲区),收到的数据(接受缓冲区)来保证正确的序号

udp则没有

二.TCP连接及状态转移

 1. 参数含义

ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1

ack:  回复要接受的下一个序号即 收到对方的序号后+1

seq: 回复自己的序号,保证tcp的可靠性,数据块不丢失和顺序性

SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此,  SYN置1就表示这是一个连接请求或连接接受报文。

FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。

  2. 三次握手连接



             

  (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
     (2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

     (3)第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

4.四次挥手断开连接



            

   由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
  (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
  (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

      当客户端 没有东西要发送时就要释放 客户端这边的连接,客户端会发送一个报文(没有后会给应用程序一个信,这时客户端那边的连接已经关闭,即客户端不再发送信息(但仍可接收信息) 。  客户端收到服务器的确认后进入等待状态,(半关闭状态 可读 不可写)等待服务器请求释放连接, 服务器数据发送完成后就数据),其中 FIN 设置为1,  服务器 收到向客户端请求连接释放,也是用FIN=1 表示, 并且用 ack = u+1(如图), 客户端收到后回复一个确认信息,并进入 TIME_WAIT 状态, 等待 2MSL 时间。



     上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体


           

3.传输过程

    (1)带外数据

                  有些传输层协议剧有带外数据的概念(OOB   out of Band),用于迅速通告对方本端发生的重要事件,因此,带外数据比普通数据(带内数据)有更高的优先级,应被立即发送  UDP没有实现带外数据的传输,TCP利用其头部中的紧急指针标志和紧急指针两个字段,来实现紧急数据的传输

    (2)超时重传

                 TCP服务必须能够在重传超时时间内未收到确认的TCP报文段,所以,TCP中有一个重传定时器,在TCP报文第一次被发送时启动。如果超时未收到接收方得应答,TCP则重新传送该TCP报文段,并且重置定时器

      (3)拥塞控制

              慢启动  拥塞避免  快速重传  快速恢复

       发送端需合理的选择发送窗口的大小(SWND),如果太小,会引起明显的网络延迟,反之,太大,容易导致网络拥塞

  通常,如果发送端连续收到3个重复的确认报文段,就认为是拥塞发生了 

关于三次握手与四次挥手通常都会有典型的面试题

  (1)为什么建立连接要进行第三次握手

                  主要是为了防止以失效的请求连接报文突然又传给了客户端,但是因为之前超时,所以客户端重新发送了请求连接,双方已经连接好,此时服务器又收到之前的请求连接的包,就浪费了缓存区。
 (2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
  这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

       (3)断开连接客户端为什么要等待TIME_WAIT (2msl   max segment live)呢?

                为了这种情况: a.服务器向客户端发送 FIN = 1 的释放连接请求,但这个报文丢失了, 客户端没有接到不会发送确认信息, B服务器超时会重传,这时客户端在TIME_WAIT还能够接收到这个请求,这时再回复一个确认就行了。(客户端收到 FIN = 1 的请求后 TIME_WAIT会重新记时)

               b.另外服务器B存在一个保活状态,即如果客户端突然故障死机了,那服务器那边的连接资源什么时候能释放呢?  就是保活时间到了后,B会发送探测信息, 以决定是否释放连接。

               c.保证让迟来的TCP报文段有足够的时间被识别并丢弃

               d.Linux系统上,一个TCP端口不能被同时打开多次,当一个TCP连接属于TIME_WAIT状态时,我们将无法使用该链接占用的端口,否则,有可能利用该端口建立一个类似之前的连接的连接,收到属于原来连接的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值