网络协议-TCP与UDP

TCP协议

1、介绍

  • 传输控制协议,属于传输层,在程序间传输数据
  • 是一种面向连接的、可靠的、基于字节流的传输层通信协议
  • 提供可靠的数据传输(在传输数据之前需要建立连接,当数据传输完成后,需要释放连接)
  • TCP建立连接的三次握手过程
  • TCP释放连接的四次挥手过程
  • 仅支持单播传输

2、报文格式

  • TCP报文格式
    • Source Port(源端口): 50860 (50860),一般随机端口
    • Destination Port(目的端口): pando-pub (7680),一般是固定的
    • Sequence number: 1 (relative sequence number)
    • Sequence number (raw): 698089134,同步序号,只有flags位SYN时才有效
    • Acknowledgment number: 129 (relative ack number)
    • Acknowledgment number (raw): 2316433842,确认序号
    • 0101 … = Header Length(首部长度): 20 bytes (5)
    • flags
      • URG:紧急位,标识紧急指针是否有效
      • ACK:确认位,确认序号是否有效
      • PSH:标识收到的数据先缓存还是直接递交给上层
      • RST:重置位
      • SYN:同步序号位,请求建立连接
      • FIN:释放连接,数据已经传完,一般情况下立即释放连接
    • Window size value(窗口大小): 1043
    • Checksum(校验): 0x02ca [unverified]
    • Urgent pointer(紧急指针): 0

3、TCP的三次握手

  • 服务器是经历三个状态:初始下,服务器处于监听状态(listening),当服务器收到客户机的SYN报文后,进入SYN_RECV(半连接),服务器会使用一部分资源来保持一段时间,当收到客户机第三次握手后,进入establised状态(建立连接),就可以进行数据传输,当数据传输完成,会进行保持连接一段时间,是time-wait状态。如下图

    在这里插入图片描述

  • 为什么要三次握手而不是两次呢

    • 为了防止已经失效的请求报文,重新传到服务器引起错误。假设是两次握手,客户端发起一次SYN请求后,由于网络阻塞没有发送到服务器;当客服端再次发送SYN请求,正常发送到服务器后,服务器响应SYN+ACK确认,建立起连接;这时客户端第一次发送的SYN请求因为网络恢复,重新传到服务器,服务器以为是客户端发起新的连接请求,再次响应SYN+ACK数据包;这时客户端认为是一个连接,服务端认为是两个连接,造成状态不一致
    • 两次握手后建立连接,如果有主机恶意发送大量SYN请求,服务器收到后会响应SYN+ACK数据包,进入等待数据传输状态,会造成资源浪费,甚至服务器无法正常工作

4、TCP数据传输

  • 数据传输

    • 分包传输:设A向B分两次传输200字节

      • 主机A通过1个数据包发送100个字节的数据,数据包的 Seq 号设置为 1200。主机B为了确认这一点,向主机A发送 ACK 包,并将 Ack 号设置为 1301。

      • 为了保证数据准确到达,目标机器在收到数据包(包括SYN包、FIN包、普通数据包等)包后必须立即回传ACK包,这样发送方才能确认数据传输成功。

      • 此时 Ack 号为 1301 而不是 1201,原因在于 Ack 号的增量为传输的数据字节数。假设每次 Ack 号不加传输的字节数,这样虽然可以确认数据包的传输,但无法明确100字节全部正确传递还是丢失了一部分,比如只传递了80字节。因此按如下的公式确认 Ack 号:

        Ack号 = Seq号 + 传递的字节数 + 1
        
      • 与三次握手协议相同,最后加 1 是为了告诉对方要传递的 Seq 号。

  • 如何解决丢包,乱序

    • 发送报文:序列号Seq、长度、数据内容
    • 回复确认:Ack=Seq + 长度 +1
    • 切割发送:根据序列号和长度重组
    • 如果某一段报文丢失,或长度不同,则根据Ack重新传输

5、TCP的四次挥手

  • 过程

    在这里插入图片描述

    • 客户端主动发起连接关闭请求,向服务端发送FIN包,客户端进入FIN-WAIT-1状态
    • 服务器收到FIN包后,响应ACK报文,服务端进入CLOSE-WAIT状态,客户端收到ACK报文后进入FIN-WAIT-2状态
    • 此时客户端和服务端还可以进行数据的收发
    • 数据传输结束后,服务端发送FIN包,进入LAST-ACK状态
    • 客户端收到FIN后,回复ACK包,进入TIME-WAIT状态,一段时间后断开连接
    • 服务器收到ACK包后,直接关闭连接
  • 为什么客户端收到FIN后会进入TIME-WAIT状态

    • 为保证服务端已经收到ACK包。一旦发送完ACK后就立即断开连接,如果ACK包在传输过程中丢失,服务端会一直停留在LAST-ACK状态,等待ACK数据包。如果一直没有收到ACK数据包,服务端会重新发送FIN包,等待客户端进行确认

断开连接,如果ACK包在传输过程中丢失,服务端会一直停留在LAST-ACK状态,等待ACK数据包。如果一直没有收到ACK数据包,服务端会重新发送FIN包,等待客户端进行确认

UDP协议

1、介绍

  • UDP是无连接的。发送数据之前不需要像TCP那样三次握手后才开始数据传输,释放连接也不需要四次挥手,所以UDP传输数据是快速的
  • UDP尽最大努力交付。不能保证可靠的数据交付
  • UDP是面向报文的

2、UDP报文结构

  • 源端口
  • 目的端口
  • 长度
  • 校验和
  • 数据

TCP与UDP的区别

TCPUDP
面向连接的无连接的
基于字节流基于数据报文
可靠稳定不可靠、不稳定
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值