TCP与UDP
Socket
socket是一种操作系统提供的进程间通信机制。在网络环境中,套接字是建立网络应用程序的可编程接口。
一个套接字包括:主机的IP地址和进程的端口号。
套接字分为3中类型:
- 流套接字:主要用于TCP协议,它提供了双向的、有序的、无重复的、无记录边界的数据传输服务。
- 数据报套接字:主要用于UDP协议,它提供双向的、无序的、有重复的、有记录边界的数据传输服务。
- 原始套接字:主要用于访问底层协议,例如IP、ICMP与IGMP等协议。原始套接字可以保存IP包中的完整IP头部,而只是将接收的IP包存储或转发出去。
TCP
TCP协议的主要特点
-
支持面向连接的传输服务
面向连接的服务(connection-oriented service)就是通信双方在通信时,要事先建立一条通信线路,其过程有建立连接、使用连接和释放连接三个过程
-
支持字节流的传输
流相当与一个管道,从一端放入什么内容,从另外一端可以照原样取出什么内容。它描述了一个不出现丢失、重复和乱序的数据传输过程。TCP将应用程序提交的数据看成一连串的、无结构的字节流。
-
支持全双工服务
TCP允许通信双方的应用程序在任何时候都可以发送数据(也可以接收)。
-
支持同时建立多个并发的TCP连接
根据应用程序需要,TCP协议支持一个服务器与多个客户端同时建立多个TCP连接,也支持一个客户端与多个服务器同时建立多个TCP连接。建立并发,连接的数量越多,每条连接共享的资源就会越少。
-
支持可靠传输服务
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报文原因可能有两点:
- 数据在传输过程中由于网络原因等直接全体丢包,接收方根本没有接收到。
- 接收方接收到了响应的数据,但是发送的ACK报文响应却由于网络原因丢包了。
TCP在解决这个问题的时候引入了一个新的机制,叫做超时重传机制。简单理解就是发送方在发送完数据后等待一个时间,时间到达没有接收到ACK报文,那么对刚才发送的数据进行重新发送。如果是刚才第一个原因,接收方收到二次重发的数据后,便进行ACK应答。如果是第二个原因,接收方发现接收的数据已存在(判断存在的根据就是序列号,所以上面说序列号还有去除重复数据的作用),那么直接丢弃,仍旧发送ACK应答。
-
连接管理
连接管理就是三次握手与四次挥手的过程,保证可靠的连接,是保证可靠性的前提。
-
流量控制
目的:让发送方控制发送速率,使之不超过接收方的接收速率,防止接收方由于来不及接收到达的字节流而出现报文丢失的现象。
传输层可以利用滑动窗口协议,在TCP连接上方便地实现收发双方流量控制的目的、
-
拥塞控制
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
滑动窗口
- TCP使用两个缓存和一个窗口来控制字节流的传输过程。
- 发送方的TCP有一个缓存,用来存储应用程序准备发送的数据。发送方对这个缓存设置一个发送窗口,只要这个窗口不为0就可以发送报文段。
- TCP的接受方也有一个缓存,接收方将正确接收到的字节流写入缓存,等待接收方应用程序读取。接收方对接收缓存设置一个接收窗口,窗口值等于接收缓存可以继续接收字节流的多少。
- 接收方通过TCP报头通知发送方:已经正确接收的字节号,以及发送方还能够继续发送的字节数。
- 接收窗口的大小由接收方根据接收缓存剩余空间的大小、应用进程读取字节流的速度决定。发送窗口的大小取决于接收窗口的大小。
UDP
UDP协议的主要特点
-
UDP是一种无连接的、不可靠的传输层协议。
-
UDP是一种面向报文的传输层协议。
UDP对应用程序提交的报文既不合并也不拆分,而是保留原报文的长度与格式。接收方会将发送方传送的报文原封不动地提交到接收方应用程序。
TCP协议与UDP协议的比较
| 特征/描述 | TCP | UDP |
|---|---|---|
| 一般描述 | 允许应用程序可靠地发送数据,功能齐全 | 简单、高速,只负责将应用层与网络层衔接起来 |
| 面向连接或无连接 | 面向连接,在TPUD传输之前需要建立TCP连接 | 无连接,在TPUD传输之前不需要建立UDP连接 |
| 与应用层的数据接口 | 基于字节流,应用层不需要规定特定的数据格式 | 基于报文,应用层需要将数据分成包来传送 |
| 可靠性与确认 | 可靠报文传输,对所有数据均要确认 | 不可靠,不需要对传输的数据确认,尽力而为地交付 |
| 重传 | 自动重传丢失的数据 | 不负责检查是否丢失数据和重传 |
| 开销 | 低,但高于UDP | 很低 |
| 传输速率 | 高,但低于UDP | 很高 |
| 适用的数据量 | 从少量到几个GB的数据 | 从少量到几百个字节的数据 |
| 适用的应用类型 | 对数据传输可靠性要求较高的 | 发送数量比较少,对数据传输的可靠性要求较低的应用,例如IP电话、视频会议、多播与广播 |