TCP和UDP

前言

TCP:传输控制协议,是一种面向连接的,可靠的,基于字节流的运输层通信协议。在OSI七层模型中完成了第四层传输层所指定的功能。

UDP:数据包协议是一种无连接的传输协议,提供面向事务的简单不可靠信息传送服务。

TCP编程步骤

1、TCP编程的服务端一般步骤是:

  • 创建一个socket
  • 设置socket属性(可选)
  • 绑定IP地址、端口等信息到socket上
  • 开启监听
  • 接收客户端上来的连接
  • 收发数据
  • 关闭网络连接
  • 关闭监听

2、TCP编程的客户端一般步骤是:

  • 创建一个socket
  • 设置socket属性(可选)
  • 绑定IP地址、端口等信息到socket上
  • 设置要连接的对方的IP地址和端口等属性
  • 连接服务器
  • 收发数据
  • 关闭网络连接

UDP编程步骤

1、UDP编程的服务端一般步骤是:

  • 创建一个socket
  • 设置socket属性(可选)
  • 绑定IP地址、端口等信息到socket上
  • 循环接收数据
  • 关闭网络连接

2、UDP编程的客户端一般步骤是:

  • 创建一个socket
  • 设置socket属性(可选)
  • 绑定IP地址、端口等信息到socket上
  • 设置对方的IP地址和端口等属性
  • 发送数据
  • 关闭网络连接

TCP与UDP区别

1、基本区别

  • TCP面向连接,UDP是无连接的,即发送数据之前不需要建立连接
  • TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达,UDP尽最大努力交付,即不保证可靠交付
  • TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流,UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低
  • 每一条TCP连接只能是点到点的,UDP支持一对一,一对多,多对一和多对多的交互通信
  • TCP首部开销20字节,UDP首部开销小,只有8字节
  • TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

2、编程区别

  • socket()的参数不同
  • UDP Server不需要调用listen和accept
  • UDP收发数据用sendto / recvfrom函数
  • TCP地址信息在connect / accept时确定
  • UDP在sendto / recvfrom函数中每次均需指定地址信息
  • UDP的shutdown函数无效

TCP与UDP报文结构

1、TCP报文

TCP报文是TCP层传输的数据单元,也叫报文段

  • 端口号:用来标识同一台计算机的不同的应用程序

    • 源端口:源端口和IP地址的作用是标识报文的返回地址
    • 目的端口:端口指明接收方计算机上的应用程序接口

    TCP报文中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接

  • 序号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号,序号确保了TCP传输的有序性,确认号指明下一个期待接收的字节序号,表明该序号之前的所有数据已经正确无误地收到

  • 数据偏移 / 首部长度:4bits。由于首部可能含有可选项内容,因此TCP报文的长度是不确定的,报文不包含任何任选字段则长度为20字节,最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值

  • 保留:为将来定义新的用途保留,现在一般置0

  • 控制位:URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能

    • URG:紧急指针标志,为1时表示紧急指针有效,为0时则忽略紧急指针
    • ACK:确认序号标志,为1时表示确认号有效,为0时表示报文不含确认信息,忽略确认号字段
    • PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段应用程序,而不是在缓冲区排队
    • RST:重置连接标志,用于重置由于主机奔溃或其他原因而出现错误的连接,或者用于拒绝非法的报文段和拒绝连接请求
    • SYN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流
  • 窗口:滑动窗口大小,用来告知发送端接收端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535

  • 校验和:奇偶校验,此校验和是对整个TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。,由发送端计算和存储,并由接收端进行验证

  • 紧急指针:只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和顺序字段中的值相加表示紧急数据最后一个字节的序号,TCP的紧急方式是发送端向另一端发送紧急数据的一种方式

  • 选项和填充:最常见的可选字段是最长报文大小,又称为MSS,每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接收的最大报文的长度,选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的0,以保证TCP头是32的整数倍

  • 数据部分:TCP报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部,如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据,在处理超时的许多情况下,也会发送不带任何数据的报文段

2、UDP报文

  • UDP有两个字段:数据字段和首部字段

    首部字段

    UDP的首部字段很简单,只有8字节,有4个字段组成,每个字段的长度都是2个字节

    • 源端口:原端口号。在需要对方回信时选用,不需要时可用全0
    • 目的端口:目的端口号。这在终点交付报文时必须要使用到
    • 长度:UDP用户数据报的长度,其最小值是8(仅有首部)
    • 校验和:检测UDP用户数据在传输中是否有错,有错就丢弃
  • 要注意的地方

    • UDP首部中校验和的计算方法有些特殊,在计算校验和时,要在UDP用户数据报之前增加12个字节的伪首部
    • 伪首部既不向下传达也不向上递交,而仅仅是为了计算校验和
    • 与IP数据报的校验和只校验IP数据报的首部不同,UDP的校验和是把首部和数据部分一起都校验

    伪首部

TCP与UDP使用场景

1、TCP:由于其可靠性,一般都用在一般网页、邮件、远程连接、文件传送

2、UDP:是面向消息的协议,通信的时候不需要建立连接,不可靠,但是其传输的数据量大,要是不注重数据的安全,只要求流畅性,可以用在:语音广播、视频、QQ实时传送协议、路由协议等

TCP与UDP相关问题

1、安全性问题

TCP协议中包含着传递保证机制,当数据接受方收到发送方传来的信息时,会自动发出确认的信息,发送方只有在接收确认消息后才继续发送其消息,否则一直等待直到接收确认信息为止。

UDP在传输的过程中出现数据丢失的情况,协议本身不能做出任何的提示或是检测,两个应用程序通信不需要提前建立连接,并且不提供差错控制,不提供数据重传,因此不可靠。

2、发送和接收问题

TCP发送进程将流分割成数据片段序列,然后将其作为IP数据包传送。每一个TCP片段均有一个序号,它在片段的第一个字节给出流中的字节数,接收程序在将数据放入接收进程之前,使用序号对数据进行排序,只有所有编号较小的片段都已经放到了流中后,编号大的片段才能被放到流中,因此未按顺序到达的片段是必须保存在一个缓冲区内,直到它前面的数据片段到达为止。

UDP并不能确保数据的发送和接收问题,在发送就有可能丢失的情况,但是只有在网络非常拥挤的情况下才会出现这样的乱序问题。

总结

TCP充分实现了数据传输时各种控制功能,可以进行丢包的重发机制,还可以对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP作为一种面向连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

  • TCP流控制:发送方管理不能使接收方或是中点过载,通过片段确认机制完成
  • 重传机制:发送方记录它发送的片段序号,当它接收到一个确认信息的时候,就知道信息接收成功,并将其从缓冲区中删除掉,否则在一定时间内没有接收到确认消息后,则重新发送当前缓存区中当前序号的片段
  • 缓冲机制:接收方的接收缓冲区用于平衡发送方与接收方之间的流量及解决数据片段的顺序排序问题
  • 校验和:每一个片段都包含一个对头和片段中的数据的检验和,如果接收到的片段和校验和不匹配,则片段被丢弃

UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务,并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输中如果出现了丢包,UDP也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交给由采用UDP的应用程序去处理。换句话说,UDP将部分控制转移到应用程序去处理,自己却只提供作为传输层协议的最基本功能。