传输层协议之TCP/UDP

1、UDP

  UDP协议是面向无连接的,即不需要在正式传递数据前先链接双方,UDP协议只是数据报文的搬运工,不保证有序且不丢失的传递到对端,且UDP协议无任何控制流量的算法,UDP相对于TCP更加轻便。

  特征:

  • 面向无连接:在发送端,应用层将数据传递给传输层的UDP协议,UDP只会给数据增加一个UDP头标识下是UDP协议,然后就传递给网络层了;在接收端,网络层将数据传递给传输层,UDP只是去除IP报文头就传递给了应用层。
  • 不可靠性:UDP协议的不可靠性主要表现在以下几个方面:
    • 无连接,想发就发
    • 收什么数据就传什么数据且不会备份,也不会关新对端是否正确接收
    • 无拥塞控制,一直会以恒定的速度发送数据,即使网络不好也不会调整速率,所以当网络不好时可能导致丢包
  • 高效:UDP头部开销小,只有8个字节。由两个16位的端口号[源端口(可选)+目标端口]+整个报文的长度和整个数据报文的校验+IPv4(可选)组成
  • 传输方式:单播(一对一)、多播(一对多)、广播(多对多)
  • 适合使用场景:实时性要求高的地方,如直播、王者荣耀等

2、TCP

1)头部

  • Sequence Number:这个序号保证了TCP传输的报文都是有序的,对端可以通过序号顺序拼接报文
  • Acknowledgement number:次序号表示数据接收端期望接受的下一字节编号是多少,同时也表示上一个序号的数据已到达
  • window size:窗口大小,表示还能接收多少字节的数据,用于流量控制
  • 标识符:
    • URG=1:表示本数据报文的数据部分包含紧急信息,是一个高优先级数据报文段,此时紧急指针有效
    • ACK=1:表示确认号字段有效,TCP规定连接后传送的所有报文ACK=1
    • PSH=1:表示接收端应该立即将数据PUSH给应用层,而不是等缓存区满之后再提交
    • RST=1:表示当前TCP连接出现严重的问题,可能需要重新建立连接
    • SYN=1:当SYN=1,ACK=0时,表示当前报文段是一个连接请求报文;当SYN=1,ACK=1时,表示当前报文段是一个同意连接请求的报文
    • FIN=1:表示此报文段是一个释放连接请求的报文段

2)状态机

性能指标RTT:表示发送端发送数据到接收到对端数据所需要的往返时间

三次握手:

  TCP协议中,主动发起请求的为客户端,被动连接的是服务端,连接后双方都能发送和接收数据,因此TCP是一个双全工协议

  • 客户端发送连接请求到服务端,该报文段中包含自身的数据通讯初始序号,请求发送后,客户端便进入SYN-SENT状态
  • 服务端收到连接请求报文后,如果同意连接,则发送一个应答,该应答中也包含自身数据通讯初始序号,发送完后进入SYN-RECEIVED状态
  • 客户端收到连接同意应答后,还需要向服务端发送一个确认报文,发完后进入ESTABILISED状态,服务端接收到后也进入ESTABLISHED状态

  TCP需要三次握手的原因:防止失效的连接请求段被服务端接收从而影响错误

四次挥手

  • 若客户端A认为发送数据完成,则他需要向服务端B发送连接释放请求
  • B收到释放请求之后,会告诉应用层要释放TCP连接,然后会发送ACK包,并进入CLOSE-WAIT状态,表示A到B的连接已经释放,不再接收A发的数据了,但由于TCP连接是双向的,所以B仍然可以给A发送数据
  • 若B此时还没发送完数据会继续发送,完毕后会向A发送释放连接请求,然后B进入LAST-ACK状态
  • A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态,该状态会持续2MSL(最大段生存周期)时间,若该时间段内无B的重发请求就会进入CLOSED状态,当B收到确认应答后也进入CLOSED状态

  A会进入TIME-WAIT状态等待2SML时间的原因:为了保证B能收到A的应答,若A发完确认后直接进入CLOSED状态,如果确认应答因为网络问题一直没送达,就会造成B不能正常关闭。

猜你喜欢

转载自www.cnblogs.com/qiyangliu/p/11334522.html