zoukankan      html  css  js  c++  java
  • TCP、UDP、区别

    TCP

    三次握手

    第一次:客户端发送SYN,进入SYN_SEND状态。

    第二次:服务端收到SYN,并发送SYN和ACK,由LISTEN状态变为SYN_RECVD状态。

    第三次:客户端收到SYN和ACK,发送ACK报文,进入到ESTABLISHED状态。(服务端收到后也进入ESTABLISHED状态)

    四次挥手(客户端和服务端均可主动关闭)

    第一次:客户端传送给服务端的数据传输完成后,发送FIN,进入FIN_WAIT1状态。

    第二次:服务端收到FIN,若有数据还需传送给客户端,则继续传输数据,传输完成后发送ACK。

    第三次:客户端收到ACK,进入FIN_WAIT2状态。服务端传输FIN,进入LAST_ACK状态。

    第四次:客户端收到FIN,发送ACK。服务端收到ACK,直接进入CLOSED状态。等待2MSL(最大报文生存时间)后进入CLOSED状态。

    p.s.

    SYN 同步序列号,TCP建立连接时会将该位置1。

    ACK  由目的端发出,表示确认号之前的数据段都收到了。e.g.确认号为X,则表示前X-1个数据段都收到了,只有ACK  =1是确认号才有效。若ACK =0,为保证数据的完整性,发送端需重传数据。

    FIN 当需要断开数据传输时,提出断开的一方将该位置1。

    RST 表示重置,重新建立连接。

    MSL最大报文生存时间,一般是30s,1min或2min。

    TTL(time-to-live生存时间),并不是具体的时间,而是设置了数据报可以经过的最大路由器的数目,每经过一个路由器,该值减一。当TTL为0,该数据报被丢弃。

    RTT往返时间,TCP的超时与重传需要对一个给定连接的往返时间RTT的测量。由于路由器和网络流量均会变化,因此RTT也经常变化。

    QA:

    1.为什么收到服务端的确认后,客户端还需第三次握手?

    为了防止失效的请求报文段突然又传到服务端,因而产生错误。

    e.g.客户端发送到服务端的SYN报文在网络中长时间滞留,直到连接释放后才到达服务端,若没有第三次握手,则服务端就会建立连接,并一直监听客户端,造成服务端资源的浪费。

    2.为什么要四次挥手?

    保证数据能够完成传输。

    一方发送FIN,只表示该方没有数据发送给另一方了,但另一方可能仍有数据发送给该方。要等到两方都没有数据发送给对方,才可以断开连接。

    3.第二次握手时的SYN有什么用?

    丢弃重复的失效的报文。

    客户端发送SYN给服务端,若长时间没有收到服务端的回复,会超时重传SYN。此时网络中就会有两个SYN,后到服务器的SYN是无效的,服务器为了判断收到的SYN的有效性,会发送SYN给客户端查询该SYN报文的有效性。

    客户端发起握手请求,服务端无法立即建立连接会回复什么?

    RST报文

    4.TIME_WAIT产生的原因?

    1)可靠地实现TCP连接的关闭

    我们不能保证服务端一定能够收到最后的ACK报文。若客户端发送ACK后直接进入CLOSED状态,当ACK报文丢失时,服务端长时间没有收到客户端回复,会重传FIN报文,此时会收到一个RST,服务端会认为有错误发生,不能正常的关闭连接,造成服务端资源的浪费。而让客户端处于TIME_WAIT就不会出现这种情况,在再次收到服务端的FIN后,客户端会重传ACK,并重新计时。

    2)保证本连接内的重复报文在网络中消逝,避免影响下一次的连接。

    TCP v.s UDP

    1)连接

    2)可靠性:TCP提供交付保证,若信息在传输时丢失,将会重发。UDP不提供任何交付保证。

    3)有序性:消息到达另一端可能是无序的,TCP为排好序,UDP不会。

    4)速度:TCP慢,适合传输大量数据;UDP快,适合传输少量数据。

    5)量级:TCP重量级协议,报头包含序列号,ACK号,数据偏移量、保留、控制位、窗口、紧急指针、可选项、填充项、校验位、源端口和目的端口,至少20字节。UDP轻量级,报头只包含长度、源端口号、目的端口、校验和,固定8字节。

    6)流量控制和拥塞控制:TCP有,UDP无。

    7)TCP面向字节流,UDP面向报文。

    8)TCP只能单播,不能发送广播和组播;UDP皆可。

    TCP 应用场景: 效率要求相对低, 但对准确性要求相对高的场景。 因为传输中需要 对数据确认、 重发、 排序等操作, 相比之下效率没有 UDP 高。 举几个例子: 文件传输、 邮 件传输、 远程登录。

    UDP 应用场景: 效率要求相对高, 对准确性要求相对低的场景。 举几个例子: QQ 聊天、 QQ 视频、 网络语音电话(即时通讯, 速度要求高, 但是出现偶尔断续不是太大问 题, 并且此处完全不可以使用重发机制) 、 广播通信(广播、 多播) 。

  • 相关阅读:
    [bzoj3038/3211]上帝造题的七分钟2/花神游历各国_线段树
    [bzoj1002][FJOI2007]轮状病毒_递推_高精度
    UNIX环境高级编程——线程同步之互斥锁、读写锁和条件变量(小结)
    UNIX环境高级编程——线程与进程区别
    UNIX环境高级编程——死锁
    UNIX环境高级编程——线程同步之条件变量以及属性
    UNIX环境高级编程——线程同步之读写锁以及属性
    UNIX环境高级编程——线程同步之互斥量
    UNIX环境高级编程——pthread_create的问题
    UNIX环境高级编程——主线程与子线程的退出关系
  • 原文地址:https://www.cnblogs.com/yvlian/p/13162393.html
Copyright © 2011-2022 走看看