TCP

  • TCP特点:
      • TCP是面向连接的传输层协议:

应用程序在使用TCP协议之前必须先建立TCP连接。在传送数据结束后,必须释放已经建立的TCP连接

      • 每一条TCP连接只能有两个端点:

每一条TCP连接只能是点对点的

      • TCP提供可靠交付的服务:

通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达

      • TCP提供全双工通信:

TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP的缓存后,就可以处理其它事情,而TCP在适合的时候把数据发送出去。在接收时,TCP把收到的数据放入到缓存,上层的应用进程在适合的时候读取缓存中的数据。

      • 面向字节流:

TCP中的流(Stream)指的是流入到进程或者从进程流出的字节序列。面向字节流的含义是:虽然应用程序和TCP的交换是一次一个数据块,但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。

  • TCP三次握手:

      • 为什么要进行第三次握手:如果没有第三次握手,在Server对Client的请求进行回应(第二次握手)后,就会理所当然的认为连接已建立,而如果Client并没有收到Server的回应,此时Client仍认为连接未建立,Server会对已建立的连接保存必要的资源,如果大量的这种情况,Server会崩溃。
      • 为什么不进行四次握手:既然没法确认第二次的握手,Client是否可以收到, 那么怎么确定第三次握手Server就可以收到呢?不错,这根本没法确定,因为完全可靠的通信协议是根本不存在的,我们任何的通信协议都是在接受这样的现实情况之上进行的。 而三次握手后,C和S至少可以确认之前的通信情况,但无法确认之后的情况。在这个道理上说,无论是四次还是五次或是更多次都是徒劳的。
  • TCP四次挥手:

      • SYN(Synchronize Flag):用于建立连接。SYN为1表示希望建立连接,并在其序列号的字段进行序列号初始值的设定。
      • ACK(Acknowledgement Flag):该位为1时,确认应答的字段变为有效。TCP规定除了最初建立连接时的SYN包之外该为必须设置为1。
      • FIN(Fin Flag):该位为1时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为1的TCP段。每个主机又对对方的FIN包进行过确认应答以后就可以断开连接。不过,主机收到FIN设置为1的TCP段以后不必马上回复一个FIN包,而是可以等到缓冲区中的所有数据都因已成功发送而被自动删除之后再发。
      • MSL(Maximum Segment Lifetime-最长报文段寿命):这个超时设置是2MSL(RFC793定义MSL为2分钟)
      • 为什么要等待2MSL?
  1. 为了保证客户端(记为A端)发送的最后一个ACK报文段能够到达服务器端。这个ACK报文段有可能丢失,因而使处在LASK—ACK端的服务器端(记为B端)收不到对已发送的FIN+ACK报文段。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。接着A重传一次确认,重新启动2MSL计时器。最后,A和B都正常进入到CLOSED状态。如果A在TIME_WAIT状态不等待一段时间,而是在发送完ACK确认后立即释放连接,那么就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段,这样,B就无法正常进入CLOSED状态。
  2. 我们都知道,假如A发送的第一个请求连接报文段丢失而未收到确认,A就会重传一次连接请求,后来B收到了确认,建立了连接。数据传输完毕后,就释放了连接。A共发送了两个连接请求报文段,其中第一个丢失,第二个到达了B。假如现在A发送的第一个连接请求报文段没有丢失,而是在某些网络节点长时间都留了,以至于延误到连接释放后的某个时间才到达B,这本来是已失效的报文段,但B并不知道,就会又建立一次连接。而等待的这2MSL就是为了解决这个问题的,A在发送完最后一个确认报后,在经过时间2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失,这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。
posted @ 2019-09-17 14:37  zty-lyq  阅读(212)  评论(0编辑  收藏  举报