1 TCP与UDP之间的相同点
UDP协议和TCP协议都是传输层协议。
2 UDP
2.1 UDP 的概念
UDP(User Data Protocol,用户数据报协议)是一个简单的面向数据报的传输层协议。它不提供可靠性,只是把应用程序传给IP层的数据报发送出去,但是不能保证它们能到达目的地。由于UDP在传输数据报前不用再客户和服务器之间建立一个连接,且没有超时重发等机制,所以传输速度很快。面向报文
2.2 UDP的报文头部
16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度。如果UDP校验和出错,就会被直接丢弃。
UDP的最大数据长度为64K(包括UDP的首部),假如数据长度超过64K,就需要在应用层手动分包,UDP无法保证数据包的序号,需要在应用层进行编号。
2.3 UDP的特点
1.无连接:知道对端的IP和端口号就可以直接进行传输,不需要建立连接。
2.不可靠:没有确认机制,没有重传机制,如果因为网络故障该段无法发送到对方,UDP协议层也不会给应用层返回任何错 误 信息。
3.面向数据报:不能够灵活的控制读写的次数和数量,应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并
4. 数据包不够灵活,但是可以明确区分两个数据包,避免粘包问题。
3 TCP
3.1. TCP的概念
TCP(Transmission Control Protocol,传输控制协议)提供的是面向连接,可靠的字节流服务。即客户和服务器交换数据前,必须现在双方之间建立一个TCP连接,之后才能传输数据。并且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。面向字节流
3.2 TCP的报文头部
源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;
32位序号/32位确认号: 不一定从0开始(作用:保证确认应答;保证数据按序到达;去重)
4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP报头最大长度是15 * 4 = 60 字节
6位标志位:
1. URG: 紧急指针是否有效
2. ACK: 确认号是否有效
3. PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
4. RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
5. SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
6. FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段
16位窗口大小: 接收缓冲区剩余的空间大小
16位校验和: 发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP 首部, 也包含TCP数据 部分.
16位紧急指针: 标识哪部分数据是紧急数据;
TIME_WAIT状态:
TCP协议规定,主动关闭连接的一方要处于TIME_ WAIT状态,等待2MSL(最大报文生存周期)的时间后才能回到CLOSED状态。
TIME_WAIT持续存在2MSL的话,就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启, 可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的)。
同时也是在理论上保证最后一个报文可靠到达(假设最后一个ACK丢失, 那么服务器会再重发一个 FIN.。这时虽然客户端的进程不在了, 但是TCP连接还在, 仍然可以重发LAST_ACK)。
2.4 TCP的特点
1.确认应答机制&***
TCP将每个字节的数据都进行了编号,即为***。
每一个ACK都带有对应的确认***,意思是告诉发送者,我已经收到了哪些数据;;下一次你从哪里开始发。
2 超时重传&***
主机A发送数据给B之后, 可能因为网络拥堵等原因, 数据无法到达主机B; 如果主机A在一个特定时间间隔内没有收到B发来的 确认应答, 就会进行重发;
主机A未收到B发来的确认应答,也可能是因为ACK丢失了,因此主机B会收到很多重复数据.。那么TCP协议需要能够识别出 那些包是重复的包,,并且把重复的丢弃掉.,这时候我们可以利用***, 就可以很容易做到去重的效果。
3 拥塞控制
每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的窗口大小做比较, 取较小的值作为实际发送的窗口。
拥塞控制, 归根结底是TCP协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力的折中方案。
4 滑动窗口机制
1. 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值.
2. 发送窗口内字段的时候, 不需要等待任何ACK, 直接发送;
3. 收到第一个ACK后, 滑动窗口向后移动, 继续发送下一个窗口字段的数据; 依次类推;
4. 操作系统内核为了维护这个滑动窗口, 需要开辟发送缓冲区来记录当前还有哪些数据没有应答; 只有确认应答过的数据, 才 能 从缓冲区删掉;
5. 窗口越大, 则网络的吞吐率就越高
5 延迟应答
如果接收数据的主机立刻返回ACK应答, 这时候返回的窗口可能比较小.
窗口越大, 网络吞吐量就越大, 传输效率就越高. 我们的目标是在保证网络不拥塞的情况下尽量提高传输效率;
6 面向字节流
创建一个TCP的socket, 同时在内核中创建一个发送缓冲区和一个接收缓冲区;
另一方面, TCP的一个连接, 既有发送缓冲区, 也有接收缓冲区, 那么对于这一个连接, 既可以读数据, 也可以写数据. 这个概念叫 做 全双工 。
1 调用write时, 数据会先写入发送缓冲区中
2.如果发送的字节数太长, 会被拆分成多个TCP的数据包发出; 如果发送的字节数太短, 就会先在缓冲区里等待, 等到缓冲区 长 度差不多了, 或者其他合适的时机发送出去
3. 接收数据的时候, 数据也是从网卡驱动程序到达内核的接收缓冲区;
4 然后应用程序可以调用read从接收缓冲区拿数据
7 TCP粘包问题
1 首先要明确, 粘包问题中的 “包” , 是指的应用层的数据包
2 在TCP的协议头中, 没有如同UDP一样的 “报文长度” 这样的字段, 但是有一个序号这样的字段;
3 站在传输层的角度, TCP是一个一个报文过来的,按照序号排好序放在缓冲区中;
4 站在应用层的角度, 看到的只是一串连续的字节数据. 那么应用程序看到了这么一连串的字节数据, 就不知道从哪个部分开始 到哪个部分是一个完整的应用层数据包。
4 总结
1 TCP是面向连接的,可靠性高;UDP是基于非连接的,可靠性低
2 由于TCP是连接的通信,需要有三次握手、重新确认等连接过程,会有延时,实时性差,同时过程复杂,也使其易于攻击; UDP没有建立连接的过程,因而实时性较强,也稍安全
3 在传输相同大小的数据时,TCP首部开销20字节;UDP首部开销8字节,TCP报头比UDP复杂,故实际包含的用户数据较 少。TCP在IP协议的基础上添加了序号机制、确认机制、超时重传机制等,保证了传输的可靠性,不会出现丢包或乱序,而 UDP有丢包,故TCP开销大,UDP开销较小
4 每条TCP连接只能时点到点的;UDP支持一对一、一对多、多对一、多对多的交互通信