zoukankan      html  css  js  c++  java
  • TCP与UDP的联系与区别

    一、TCP协议(Transmission Control Protocol,传输控制协议)

           位于传输层, 提供可靠的字节流服务。所谓的字节流服务(Byte Stream Service) 是指, 为了方便传输, 将大块数据分割成以报文段(segment) 为单位的数据包进行管理。 而可靠的传输服务是指, 能够把数据准确可靠地传给对方。 即TCP 协议为了更容易传送大数据才把数据分割, 而且 TCP 协议能够确认数据最终是否送达到对方。所以,TCP连接相当于两根管道(一个用于服务器到客户端,一个用于客户端到服务器),管道里面数据传输是通过字节码传输,传输是有序的,每个字节都是一个一个来传输。

    (1) 三次握手:握手过程中使用了 TCP 的标志(flag) —— SYN(synchronize) 和ACK(acknowledgement) 。

    • 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
    • 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
    • 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,完成三次握手

    若在握手过程中某个阶段莫名中断, TCP 协议会再次以相同的顺序发送相同的数据包。

    (2)四次挥手:由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。先进行关闭的一方将执行主动关闭,而另一方被动关闭。

    • 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
    • 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。
    • 服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
    • 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

    三次握手和四次挥手:在TCP连接中,服务器端的SYN和ACK向客户端发送是一次性发送的,而在断开连接的过程中, B端向A
    端发送的ACK和FIN是分两次发送的。因为在B端接收到A端的FIN后, B端可能还有数据要传输,所以先发送ACK,等B端处理完自己的事情后就可以发送FIN断开连接了。

     1、wait for 2MSL的原因:

    在client最后发送ACK之后,ACK可能丢失。服务器端收不到ACK则会重发FIN。所以client不能立即关闭连接,而是要等待2MSL的时间长度后再关闭。

    (2MSL是两个最长报文段生命,即一个发送和一个回复的最大时间)

    若在2MSL之后还没收到FIN,则client推断ACK已经被成功接收,则断开连接(这也是为什么client断开连接比server晚的原因)

    2、若已经建立了连接,但 客户端突然故障了怎么办?

    tcp有一个保活计时器显然,若客户端出了故障,服务器端不能一直 等下去,白白浪费资源。

    服务器端每收到一次客户端请求之后都会重新复位计时器(默认2小时),若两小时还没收到客户端任何数据,服务器会发送一个探测报文段,以后每隔75秒发一次。若连发了10个探测报文段仍没反应,服务器则认为客户端出了故障,即关闭连接。

    3、TCP使用滑动窗口机制来进行流量控制
    建立连接时,各端分配一个缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端。接收方发送的确认消息中包含了自己剩余的缓冲区尺寸。剩余缓冲区空间的数量叫做窗口。其实就是建立连接的双虎互相知道彼此剩余的缓冲区大小。

    4、拥塞控制

    拥塞控制:防止过多的数据注入到网路中,这样可以使网络中的路由器或链路不至于阻塞。拥塞控制是一个全局性的过程,和流量控制不同,流量控制是点对点的控制。

    1. 慢开始:发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态的变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接收方的接收能力,发送窗口可能小于拥塞窗口。思路就是:不要一开始就发送大量的数据,先试探一下网络的拥塞程度,也就是说由小到大增加拥塞窗口的大小。为了防止cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。 ssthresh的方法如下:当cwnd < ssthresh时,开始使用慢开始算法;当cwnd > ssthresh, 改用拥塞避免算法;当cwnd = ssthresh时,慢开始与拥塞算法任意。
    2.  拥塞避免:拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口按照线性规律缓慢增长。无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为⽆法判定,所以都当作拥塞处理),就把慢开始门限设置为出现拥塞时的发送窗口的一半,然后把拥塞窗口设置为1,执行慢开始算法:

    二、UDP协议(User Data Protocol,用户数据报协议)

    无连接协议,也称透明协议,也位于传输层。

    我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。

    两者区别:

    1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制); UDP提供无连接的传输,通信前不需要建立连接。
    2) TCP提供可靠的传输(有序,无差错,不丢失,不重复); UDP提供不可靠的传输。
    3) TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组; UDP是面向数据报的传输,没有分组开销。
    4) TCP提供拥塞控制和流量控制机制; UDP不提供拥塞控制和流量控制机制。

  • 相关阅读:
    network / ethtool / eno
    java使用秘钥 对字符串进行加密、解密
    windows服务器环境下使用jenkins自动化部署vue前端项目
    ESXi下的常用命令
    使用kubeadm手动安装Kubernetes(附带Dashboard)
    cobbler高可用方案
    Linux服务器端口access改为trunk all
    Corosync fence盘替换
    Linux服务器CPU性能模式
    本地代码上传github失败常见错误
  • 原文地址:https://www.cnblogs.com/sunny0824/p/13695287.html
Copyright © 2011-2022 走看看