文章

TCP与UDP

Socket

socket是一种操作系统提供的进程间通信机制。在网络环境中,套接字是建立网络应用程序的可编程接口。

一个套接字包括:主机的IP地址和进程的端口号。

套接字分为3中类型:

  1. 流套接字:主要用于TCP协议,它提供了双向的、有序的、无重复的、无记录边界的数据传输服务。
  2. 数据报套接字:主要用于UDP协议,它提供双向的、无序的、有重复的、有记录边界的数据传输服务。
  3. 原始套接字:主要用于访问底层协议,例如IP、ICMP与IGMP等协议。原始套接字可以保存IP包中的完整IP头部,而只是将接收的IP包存储或转发出去。

TCP

TCP协议的主要特点

  1. 支持面向连接的传输服务

    面向连接的服务(connection-oriented service)就是通信双方在通信时,要事先建立一条通信线路,其过程有建立连接、使用连接和释放连接三个过程

  2. 支持字节流的传输

    流相当与一个管道,从一端放入什么内容,从另外一端可以照原样取出什么内容。它描述了一个不出现丢失、重复和乱序的数据传输过程。TCP将应用程序提交的数据看成一连串的、无结构的字节流。

  3. 支持全双工服务

    TCP允许通信双方的应用程序在任何时候都可以发送数据(也可以接收)。

  4. 支持同时建立多个并发的TCP连接

    根据应用程序需要,TCP协议支持一个服务器与多个客户端同时建立多个TCP连接,也支持一个客户端与多个服务器同时建立多个TCP连接。建立并发,连接的数量越多,每条连接共享的资源就会越少。

  5. 支持可靠传输服务

    TCP是一种可靠的传输服务协议,它使用确认机制检查数据是否安全、完整地到达,并且提供拥塞控制功能。TCP支持可靠数据的关键是对发送和接受的数据字节进行跟踪、确认和重传。需要注意的是:TCP协议建立在不可靠的网络层IP协议之上,一旦IP协议及以下层出现传输错误,TCP协议只能进行重传,试图弥补传输过程中出现的问题。

总结:TCP协议是面向连接、面向字节流、支持全双工、支持并发连接、提供确认重传与拥塞控制的可靠传输层协议。

三次握手

  • 当客户端准本发起一次TCP连接,向服务器端TCP进程发送第一个“SYN”报文(控制位SYN=1)。
  • 服务端在收到“SYN”报文之后,如果同意建立连接,则向客户端发送第二个“SYN+ACK”报文(控制位SYN=1,ACK=1)。
  • 在接收到“SYN+ACK”报文之后,客户端发送第三个“ACK”报文,表示对“SYN+ACK”报文的确认。

四次挥手

客户端和服务器端都可以主动提出释放连接的请求。

  • 当客户端准备结束一次数据传输,主动提出释放TCP连接时,向服务器发送第一个“FIN”(控制位FIN=1)报文。
  • 服务器端在接收到“FIN”报文之后,立即向客户端发回“ACK”报文,表示对接收第一个“FIN”请求报文的确认。
  • 当服务器的高层应用程序已经没有数据需要发送时,它会通知TCP可以释放连接,这时服务器端向客户端发送“FIN”报文。
  • 客户端在接收到“FIN”报文之后,向服务器端发送“ACK”报文,表示对服务器端“FIN”报文的确认。

证数据传输可靠性

  • 校验和

    计算方式:在数据传输的过程中,将发送的数据段都当做一个16位的整数。将这些整数加起来。并且前面的进位不能丢弃,补在后面,最后取反,得到校验和。 发送方:在发送数据之前计算检验和,并进行校验和的填充。 接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对。 注意:如果接收方比对校验和与发送方不一致,那么数据一定传输有误。但是如果接收方比对校验和与发送方一致,数据不一定传输成功。

  • 序列号

    TCP是面向字节流的,它要为发送字节流中的每个字节都按顺序编号。在TCP连接建立时,每一方都需要使用随机数发生器产生一个初始序号。由于是连接双方各自随机产生初始序号,因此一个TCP连接的通信双方的序号是不同的。

  • 确认应答

    确认号字段的长度为32位(4B)。确认号表示一个进程已经正确接收了序号为N的字节,要求发送方下面应该应该发送N+1的字节的报文段。

  • 超时重传

    发送方没有介绍到响应的ACK报文原因可能有两点:

    1. 数据在传输过程中由于网络原因等直接全体丢包,接收方根本没有接收到。
    2. 接收方接收到了响应的数据,但是发送的ACK报文响应却由于网络原因丢包了。

    TCP在解决这个问题的时候引入了一个新的机制,叫做超时重传机制。简单理解就是发送方在发送完数据后等待一个时间,时间到达没有接收到ACK报文,那么对刚才发送的数据进行重新发送。如果是刚才第一个原因,接收方收到二次重发的数据后,便进行ACK应答。如果是第二个原因,接收方发现接收的数据已存在(判断存在的根据就是序列号,所以上面说序列号还有去除重复数据的作用),那么直接丢弃,仍旧发送ACK应答。

  • 连接管理

    连接管理就是三次握手与四次挥手的过程,保证可靠的连接,是保证可靠性的前提。

  • 流量控制

    目的:让发送方控制发送速率,使之不超过接收方的接收速率,防止接收方由于来不及接收到达的字节流而出现报文丢失的现象。

    传输层可以利用滑动窗口协议,在TCP连接上方便地实现收发双方流量控制的目的、

  • 拥塞控制

    • 慢开始
    • 拥塞避免
    • 快重传
    • 快恢复

滑动窗口

  • TCP使用两个缓存和一个窗口来控制字节流的传输过程。
  • 发送方的TCP有一个缓存,用来存储应用程序准备发送的数据。发送方对这个缓存设置一个发送窗口,只要这个窗口不为0就可以发送报文段。
  • TCP的接受方也有一个缓存,接收方将正确接收到的字节流写入缓存,等待接收方应用程序读取。接收方对接收缓存设置一个接收窗口,窗口值等于接收缓存可以继续接收字节流的多少。
  • 接收方通过TCP报头通知发送方:已经正确接收的字节号,以及发送方还能够继续发送的字节数。
  • 接收窗口的大小由接收方根据接收缓存剩余空间的大小、应用进程读取字节流的速度决定。发送窗口的大小取决于接收窗口的大小

UDP

UDP协议的主要特点

  1. UDP是一种无连接的、不可靠的传输层协议。

  2. UDP是一种面向报文的传输层协议。

    UDP对应用程序提交的报文既不合并也不拆分,而是保留原报文的长度与格式。接收方会将发送方传送的报文原封不动地提交到接收方应用程序。

TCP协议与UDP协议的比较

特征/描述 TCP UDP
一般描述 允许应用程序可靠地发送数据,功能齐全 简单、高速,只负责将应用层与网络层衔接起来
面向连接或无连接 面向连接,在TPUD传输之前需要建立TCP连接 无连接,在TPUD传输之前不需要建立UDP连接
与应用层的数据接口 基于字节流,应用层不需要规定特定的数据格式 基于报文,应用层需要将数据分成包来传送
可靠性与确认 可靠报文传输,对所有数据均要确认 不可靠,不需要对传输的数据确认,尽力而为地交付
重传 自动重传丢失的数据 不负责检查是否丢失数据和重传
开销 低,但高于UDP 很低
传输速率 高,但低于UDP 很高
适用的数据量 从少量到几个GB的数据 从少量到几百个字节的数据
适用的应用类型 对数据传输可靠性要求较高的 发送数量比较少,对数据传输的可靠性要求较低的应用,例如IP电话、视频会议、多播与广播
本文由作者按照 CC BY 4.0 进行授权