TCP和UDP原理
1. 端口
每个应用程序进出网络都需要经过一个唯一端口,通过端口号来识别数据交由哪个应用程序处理
服务器:固定端口号(TCP 80)
客户端:1024以上随机端口
常见知名端口号:
TCP80 HTTP 超文本传输协议
TCP20 21 FTP 文件传输协议
TCP23 TELNET 远程登录
TCP25 SMTP 简单邮件传输协议
UDP53 DNS 域名解析协议
TCP443 HTTPS HTTP over SSL
2.TCP原理
TCP的建立连接
TCP运输连接有以下三个阶段:
- 建立TCP连接,也就是通过三报文握手来建立TCP连接。
- 数据传送,也就是基于已建立的TCP连接进行可靠的数据传输。
- 释放连接,也就是在数据传输结束后,还要通过四报文挥手来释放TCP连接。
TCP的运输连接管理就是使运输连接的建立和释放都能正常的进行。
2.1 TCP头部封装格式
源端口: 占16比特,写入源端口号,用来 标识发送该TCP报文段的应用进程。 目的端口: 占16比特,写入目的端口号,用来标识接收该TCP报文段的应用进程。
序号: 占32比特,取值范围[0,2^32-1],序号增加到最后一个后,下一个序号就又回到0。指出本TCP报文段数据载荷的第一个字节的序号。
确认号: 占32比特,取值范围[0,2^32-1],确认号增加到最后一个后,下一个确认号就又回到0。指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。若确认号=n,则表明到序号n-1为止的所有数据都已正确接收,期望接收序号为n的数据。
确认标志位ACK: 取值为1时确认号字段才有效;取值为0时确认号字段无效。TCP规定,在连接建立后所有传送的TCP报文段都必须把ACK置1。
数据偏移: 占4比特,并以4字节为单位。用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远。这个字段实际上是指出了TCP报文段的首部长度。
窗口: 占16比特,以字节为单位。指出发送本报文段的一方的接收窗。
同步标志位SYN: 在TCP连接建立时用来同步序号。终止标志位FIN: 用来释放TCP连接。复位标志位RST: 用来复位TCP连接。
推送标志位PSH: 接收方的TCP收到该标志位为1的报文段会尽快上交应用进程,而不必等到接收缓存都填满后再向上交付。
校验和: 占16比特,检查范围包括TCP报文段的首部和数据载荷两部分。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部。
紧急指针: 占16比特,以字节为单位,用来指明紧急数据的长度。
填充: 由于选项的长度可变,因此使用填充来 确保报文段首部能被4整除,(因为数据偏移字段,也就是首部长度字段,是以4字节为单位的)。
2.2 TCP可靠性机制
2.2.1 确认机制
Seq = 上一次Ack
Ack = 上一次Seq+length
如果没有接到,或接收到是不完整数据,会再次发送Ack请求对方重发
2.2.2 三次握手
2.2.3 四次挥手
由于TCP连接是全双工的,断开一个TCP连接,需要客户端与服务器发送四个包来确认连接的断开
简述四次挥手的过程:
1·因为TCP是全双工的,因此,每个方向都要单独关闭
2·当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着
3·一方向不会再收到数据了,但是这个TCP连接上仍然能够发送数据,直到这一方也发送了FIN.
4·首先进行关闭的一方执行主动关闭,另一方执行被动关闭.第一个关闭的最后等待2MSL
第一次挥手:
1·Client将FIN置为1,序号seq=M,发送给Server,进入FIN_WAIT_1状态
第二次挥手
1·Server收到后,将ACK置为1,ack=M+1,响应给Client,进入CLOSE_WAIT状态
2·Client收到响应后,进入FIN_WAIT_2状态
第三次挥手
1·Server在结束所有数据传输后,将Fin置为1,seq=N+1,发送给Client,进入
2·LAST_ACK状态
第四次挥手
1·Client收到后,将ACK置为1,ack=N+1,响应给Server,进入TIME_WAIT状态,等待
2·2MSL后,进入CLOSED状态
3·Server收到后,进入CLOSED状态
2.2.4 RST结束连接
收到RST置位的包后,立即结束TCP连接。
发出RST置位的包后,不必等待对方的确认,直接结束TCP连接。
2.2.5 窗口机制
滑动窗口
通过通告对方本机接收能力,来实现流量控制。
2.2.6 完整性校验
通过Checksum来检查数据完整性。
2.3 TCP特征
优点:传输可靠性高
缺点:占用带宽高,传输延迟高
2.4 TCP的适用场景
对数据完整性要求高,但对传输延迟要求低。
3. UDP的原理
3.1 UDP特征
优点:占用带宽低,传输延迟高
缺点:没有任何可靠性机制
3.2 UDP的适用场景
对传输延迟要求高,但数据完整性要求低