1.UDP(用户数据报协议)
UDP协议端格式:
- 在UDP传输的过程总,如果校验和出错,数据就会直接被丢弃。
- 16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度,也就是说,一个UDP能传输的数据最大长度是64K,而64k在当今或联网环境下,是非常小的一个数字,如果需要传输的数据超过64k,就需要在应用层手动分包,多次发送,并在接收端手动拼装。
- UDP没有真正意义上的发送缓冲区,调用sendto会直接交给内核,有内核将数据传给网络层协议进行后续的传输动作。
- UDP机油接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送的UDP报的顺序是一致的;如果缓冲区满了,再到达的UDP数据就会被丢弃。
UDP的特点:
- 无连接:只需要直到对端的IP和端口号就直接进行传输,不需要简历连接
- 不可靠:没有确认机制,没有重传机制;如果因为网络故障,该段数据无法发送到对方,UDP协议层也不会给应用层返回任何错误信息
- 面向数据报:数据只能一整条一整条的向应用层交付,不能灵活的控制读写数据的次数和数量
UDP的socket既能读,也能写,即为全双工。
2.TCP(传输控制协议)
-
源端口与目的端口:分别表示数据从哪个进程来,要到哪个进程去;
-
32位序号与确认序号:确认应答机制中的序列号与确认序号;
-
4位TCP报头长度:解析时获取tcp头部,以4字节为单位(tcp头部最小20字节,最大60字节)
-
6位标志位:
- URG:紧急指针是否有效
- ACK: 确认号是否有效
- PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
- RST: 对方要求重新建立连接; 把携带RST标识的称为复位报文段
- SYN: 请求建立连接; 把携带SYN标识的称为同步报文段
- FIN: 通知对方, 本端要关闭了, 称携带FIN标识的为结束报文段 -
16位窗口大小:实现滑动窗口,以及进行流量控制
-
16位校验和:发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题.( 此处的检验和不光包含TCP首部, 也 包含TCP数据部分. )
-
16位紧急指针: 标识哪部分数据是紧急数据;
TCP的特点:
- 面向连接:连接管理机制
- 可靠传输:确认应答、超时重传等机制来保证
- 面向字节流
2.1 连接管理机制
正常情况下,TCP要经过三次握手来建立连接,四次挥手来断开连接:
在建立连接时的三次握手过程中:
- 第一次握手:建立连接时,客户端发送SYN包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;
SYN包即为上文提到的:请求建立连接,携带SYN标识的数据报文段 - 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
在数据传输过程中,用到的就是确认应答机制:
简单理解为:TCP将每个字节的数据都进行了编号,即为序列号,每一个ACK都带有对应的确认序列号,即告诉发送者,现在已经收到了哪里的数据,下次从哪里开始发。
简单理解四次挥手断开连接的过程:
- 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
- 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
- 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
- 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
2.2 超时重传机制
超时重传可理解为:
主机A 发送一段数据给主机B,在一个特定的时间间隔内没有收到主机B 的确认应答,机会进行重发。
但是主机A未收到主机B发力啊的确认应答,也可能是因为ACK的丢失。。。。
在这种情况下,主机B就会收到很多重复的数据,搬TCP协议就需要识别出这些重复的包,并且将重复的包丢弃,此时利用序列号,就可能很好的达到去重的效果。
TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算一个最大超时时间。
- 操作系统会将超时时间以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。
- 如果重发一次以后,仍然得不到应答,将等待2*500ms后再进行重传
- 如果仍然得不到应答,等待4*500ms后进行重传,以此类推,以指数形式递增
- 类集到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接
TCP的三次握手获取连接、四次挥手断开连接、确认应答与超时重传的机制很好的保证了TCP传输的可靠性。