TCP和UDP

134 阅读7分钟

1.TCP 四元组可以唯⼀一的确定⼀一个连接,四元组包括如下:

源地址
源端⼝口
⽬目的地址
⽬目的端⼝口

2.源地址和⽬目的地址的字段(32位)是在 IP 头部中,作⽤用是通过 IP 协议发送报⽂文给对⽅方主机。

源端⼝口和⽬目的端⼝口的字段(16位)是在 TCP 头部中,作⽤用是告诉 TCP 协议应该把报⽂文发给哪个进程。

| 有⼀一个 IP 的服务器器监听了了⼀一个端⼝口,它的 TCP 的最⼤大连接数是多少? 服务器器通常固定在某个本地端⼝口上监听,等待客户端的连接请求。 因此,客户端 IP 和 端⼝口是可变的,其理理论值计算公式如下: 最大TCP链接数=客服端IP数*客服端的端口数 对 IPv4,客户端的 IP 数最多为 2 的 32 次⽅方,客户端的端⼝口数最多为 2 的 16 次⽅方,也就是服务端单机最⼤大 TCP 连接数,约为 2 的 48 次⽅方。 当然,服务端最⼤大并发 TCP 连接数远不不能达到理理论上限。 ⾸先主要是⽂文件描述符限制,Socket 都是⽂文件,所以⾸先要通过 ulimit 配置文件描述符的数⽬; 另一个是内存限制,每个 TCP 连接都要占⽤用一定内存,操作系统的内存是有限的。

## 3.UDP 和 TCP 有什什么区别呢?分别的应⽤用场景是?
    UDP 不提供复杂的控制机制,利用 IP 提供⾯面向「无连接」的通信服务。
    UDP 协议真的⾮常简洁,头部只有 8 个字节( 64 位)
    。⽬标和源端⼝:主要是告诉 UDP 协议应该把报⽂发给哪个进程。
    。包长度:该字段保存了 UDP ⾸部的长度跟数据的长度之和。
    。校验和:校验和是为了提供可靠的 UDP 首部和数据⽽设计。
    

4.TCP 和 UDP 区别:

1. 连接
    TCP 是⾯向连接的传输层协议,传输数据前先要建立连接。
    UDP 是不需要连接,即刻传输数据。
2. 服务对象
    TCP 是一对一的两点服务,即一条连接只有两个端点。
    UDP ⽀支持一对一、一对多、多对多的交互通信
3. 可靠性
    TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。
    UDP 是尽最⼤努力交付,不保证可靠交付数据。
4. 拥塞控制、流量量控制
    TCP 有拥塞控制和流量量控制机制,保证数据传输的安全性。
    UDP 则没有,即使⽹网络⾮常拥堵了,也不会影响 UDP 的发送速率。
5. ⾸首部开销
    TCP ⾸部长度较长,会有一定的开销,⾸部在没有使用字段时是 20 个字节,如果使⽤了 字段则会变长的。
    UDP 首部只有 8 个字节,并且是固定不变的,开销较小。
6. 传输⽅方式
    TCP 是流式传输,没有边界,但保证顺序和可靠。
    UDP 是⼀个包一个包的发送,是有边界的,但可能会丢包和乱序。
7. 分⽚片不不同
    TCP 的数据⼤小如果大于 MSS ⼤小,则会在传输层进行分片,目标主机收到后,也同样在传输层
    组装 TCP 数据包,如果中途丢失了一个分片,只需要传输丢失的这个分⽚。
    UDP 的数据⼤小如果⼤于 MTU ⼤小,则会在 IP 层进⾏分片,目标主机收到后,在 IP 层组装完数据,接着再传给传输层,但是如果中途丢了一个分片,则就需要重传所有的数据包,这样传输效率非常差,所以通常 UDP 的报文应该小于 MTU。
    
## 5.TCP 和 UDP 应⽤用场景:
    由于 TCP 是⾯面向连接,能保证数据的可靠性交付,因此经常⽤用于:
    FTP ⽂文件传输
    HTTP / HTTPS
    由于 UDP ⾯面向⽆无连接,它可以随时发送数据,再加上UDP本身的处理理既简单⼜又⾼高效,因此经常⽤用于:
    包总量量较少的通信,如 DNS 、SNMP 等
    视频、⾳音频等多媒体通信
    ⼴广播通信。
    
  ## 6.为什什么 UDP 头部没有「⾸首部⻓长度」字段,⽽而 TCP 头部有「⾸首部⻓长度」字段呢?
    原因是 TCP 有可变⻓长的「选项」字段,⽽而 UDP 头部⻓长度则是不不会变化的,⽆无需多⼀一个字段去记录 
    UDP 的⾸首部⻓长度。  
    
    ## 7.小结
        TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双⽅不必要的资源开销,能帮助双⽅同步初始化序列号。序列号能够保证数据包不重复、不不丢弃和按序传输。
       不使用「两次握手」和「四次握手」的原因:
         两次握⼿」:无法防止历史连接的建立,会造成双⽅资源的浪费,也⽆法可靠的同步双方序列号;
        「四次握手」:三次握手就已经理论上最少可靠连接建⽴,所以不需要使⽤更多的通信次数。
        
        **为什什么客户端和服务端的初始序列列号 ISN 是不不相同的?**
            如果⼀一个已经失效的连接被重⽤用了了,但是该旧连接的历史报⽂文还残留留在⽹网络中,如果序列列号相同,那么
            就⽆无法分辨出该报⽂文是不不是历史报⽂文,如果历史报⽂文被新的连接接收了了,则会产⽣生数据错乱。
            所以,每次建⽴立连接前重新初始化⼀一个序列列号主要是为了了通信双⽅方能够根据序号将不不属于本连接的报⽂文
            段丢弃。
            另⼀一⽅方⾯面是为了了安全性,防⽌止⿊黑客伪造的相同序列列号的 TCP 报⽂文被对⽅方接收。
        
        
        MTU:⼀一个⽹网络包的最⼤大⻓长度,以太⽹网中⼀一般为 1500 字节;
        MSS:除去 IP 和 TCP 头部之后,⼀一个⽹网络包所能容纳的 TCP 数据的最⼤大⻓长度;

如果在 TCP 的整个报⽂文(头部 + 数据)交给 IP 层进⾏行行分⽚片,会有什什么异常呢? 当 IP 层有⼀一个超过 MTU ⼤大⼩小的数据(TCP 头部 + TCP 数据)要发送,那么 IP 层就要进⾏行行分⽚片,把数 据分⽚片成若⼲干⽚片,保证每⼀一个分⽚片都⼩小于 MTU。把⼀一份 IP 数据报进⾏行行分⽚片以后,由⽬目标主机的 IP 层来 进⾏行行重新组装后,再交给上⼀一层 TCP 传输层。 这看起来井然有序,但这存在隐患的,那么当如果⼀一个 IP 分⽚片丢失,整个 IP 报⽂文的所有分⽚片都得重 传。 因为 IP 层本身没有超时重传机制,它由传输层的 TCP 来负责超时和重传。 当接收⽅方发现 TCP 报⽂文(头部 + 数据)的某⼀一⽚片丢失后,则不不会响应 ACK 给对⽅方,那么发送⽅方的 TCP 在超时后,就会重发「整个 TCP 报⽂文(头部 + 数据)」。 因此,可以得知由 IP 层进⾏行行分⽚片传输,是⾮非常没有效率的。

MSL 是 Maximum Segment Lifetime,报⽂文最⼤大⽣生存时间,它是任何报⽂文在⽹网络上存在的最⻓长时间,超 过这个时间报⽂文将被丢弃。因为 TCP 报⽂文基于是 IP 协议的,⽽而 IP 头中有⼀一个 TTL 字段,是 IP 数据 报可以经过的最⼤大路路由数,每经过⼀一个处理理他的路路由器器此值就减 1,当此值为 0 则数据报将被丢弃,同 时发送 ICMP 报⽂文通知源主机。

MSL 与 TTL 的区别: MSL 的单位是时间,⽽而 TTL 是经过路路由跳数。所以 MSL 应该要⼤大于等于 TTL 消耗为 0 的时间,以确保报⽂文已被⾃自然消亡。