UDP/TCP协议

一、UDP协议

1.1 协议格式

在这里插入图片描述

16位源端端口和16位对端端口:描述通信双方。
16位数据报长度:限制UDP报文大小应该小于64k(包含报头大小为8个字节)。
16位校验和:采用二进制反码求和算法,校验接受的数据与发送的数据是否一致。(一致则为0)。
数据:最大大小不超过64kb-8b=65527b。

1.2 协议特性

1.2.1 无连接

在通信过程之前,不需要建立连接,只需要知道对方的地址就可以发送数据。

1.2.2 不可靠

不保障数据能够安全有序到达对端。

1.2.3 面向数据报

有固定最大长度的报文传输方式(数据整条收发)。

1.3 其他

1.若发送的数据过大,则需要由用户自己在应用层堆数据进行分包操作。
2.若在应用层进行分包操作,则还需要用户在应用层进行包序管理(对每个包进行编号排序)
3.UDP进行数据传输时,是整条收发的,不会出现半条或者多条交付。因此要求应用层接收数据时缓冲区必须足够大。
4.UDP支持局域网广播传输。

二、TCP协议

2.1 协议格式

在这里插入图片描述

16位源端端口和16位对端端口:描述通信双方。 32位序号和32位确认序号:实现包序管理和确认应答。
4位头部长度:以4字节为单位,限制报头最大不超过60字节(有可能包含0~40字节的选项数据,报头最小20字节),用于解析TCP协议报文。
6位保留位:用于以后的扩用。
6位标志位:URG、ACK、PSH、RST、SYN、FIN。
它们分别表示:

URG: 紧急指针是否有效。
ACK: 确认号是否有效。
PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走。
RST:对方要求重新建立连接; 我们把携带RST标识的称为复位报文段。
SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段。
FIN:通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段。

16位窗口大小:用于实现窗口滑动机制,进行流量控制。
16位校验和:采用二进制反码求和算法,校验接受的数据与发送的数据是否一致。(一致则为0)。
16位紧急指针:定义带外数据(这里就跟它的紧急二字有关了,大家可以自己深入了解)。
选项数据:0~40字节的数据(例如三次握手过程中协商的MSS信息)。
数据:传输的数据,通过头部长度获取。

2.2 协议特性

2.2.1 面向连接

通过建立连接,从而进行数据通信。

2.2.1.1 三次握手

在这里插入图片描述

这里通过客户端向服务端发送连接请求进行说明:
1.客户端和服务端都处于CLOSED状态。
2.首先服务端调用listen先要进入LISTEN状态。
3.客户端向服务端发送SYN请求建立连接(服务端进入SYN_SENT状态)。
4.服务端向客户端发送请求回复ACK并且发送SYN请求建立连接(服务端进入SYN_RECV状态)。
5.客户端向服务端进行ACK回复(客户端进入ESTABLISHED状态)。
6.服务端收到ACK回复。(服务端进入ESTABLISHED状态)

2.2.1.2 四次挥手

在这里插入图片描述
这里也通过客户端向服务端发送连接请求进行说明:
1.客户端和服务端都处于ESTABLISHED状态(进行通信中)。
2.这时客户端(调用close)向服务端发送一个FIN包(客户端进入FIN_WAIT_1状态)。
3.服务端收到FIN包,向客户端发送ACK回复(服务端进入CLOSE_WAIT状态)。
4.客户端收到ACK回复(客户端进入FIN_WAIT_2状态)。
4.这时服务端真正调用close向客户端发送一个FIN包(服务端进入LAST_ACK状态)
5.客户端收到FIN包,向服务端进行ACK回复(客户端进入TIME_CLOSE状态)。
6.服务端收到ACK回复(服务端进入CLOSED状态)。
7.经过2MSL后,客户端进入CLOSED状态。
这里需要注意,我是用客户端与服务端进行了直观的说明,但是在四次挥手中,不一定是客户端先主动关闭,所以一般我们谈的是主动关闭方和被动关闭方,而不是客户端与服务端。

2.2.2 可靠

这里的可靠主要就包括:安全传输、避免丢包,减少性能损失。
安全传输:

面向连接:TCP的特性,保障数据能够传输到对端。
确认应答:每次收到数据都会进行确认回复,若发送数据的一方没有收到回复,则表示数据丢失,会进行数据重传。
超时重传机制:主动发送数据的一方,在指定时间内没有收到对方的确认应答,则表示数据丢失,就会重传数据。
包序管理:通过TCP协议中的序号与确认序号,保障数据能够"有序"到达对端。
数据校验:检验发送的数据与接收的数据是否一致。

避免丢包:

滑动窗口机制:进行流量控制,避免发送发发送数据过多,造成接收缓冲区数据溢出,导致数据丢失(实现原理:接收方每次接收到数据,都会重新计算自己的缓冲区剩余空间大小,将其作为窗口大小发送给对方,告诉对方发送的数据大小不能超过窗口大小)。
拥塞机制:避免发送数据时,网络较差,导致数据丢失(原理:使用一种慢启动快增长的方式发送数据,慢启动就是为了在起始阶段进行网络检测)。

减少性能损失:
前边的各种机制,虽然可以保障数据的安全可靠到达对端,但是也会导致性能的大量损耗。所以这里就会存在一些机制来减少性能的损失。

快速重传机制:超时重传,效率会很低,因此接收方在没有收到前面数据的前提下,而收到了后面的数据,则就会认为前面的数据有可能丢失,就会要求发送方对前面的数据进行重传,接收方对前面数据重传请求发送三次,接收方接收重传请求三次后,则对前面数据进行重传。(三次重传请求是为了避免前面数据并没有丢失,而是延迟到达,则就不需要重传)
捎带应答机制:确认应答只是单纯的发送一个TCP报头,会导致性能损耗,若在确认回复的时候,有数据也要发送给对方,则这时可以将数据与确认应答的数据集成一条数据发送给对端,进而提高效率。
延迟应答机制:缓冲区收到数据之后,延迟一会,进行确认回复,保障窗口大小的稳定性,保持传输的吞吐量。

2.2.3 面向字节流

TCP数据传输提供了字节流传输服务(是一种有序、可靠、基于连接、双向的一种以字节为单位的传输方式)

2.3 其他

1.TCP是面向字节流的,所以有可能会造成在上层多条请求被当成一条请求进行处理,也就是粘包问题(TCP在传输层不关注数据的边界),需要用户在应用层对数据进行边界管理。
2.TCP保活机制:双方长时间(默认7500s)没有数据通信,则每隔一段时间(默认75s)向对方发送保活探测数据包,若多次(默认9次)无响应,则认为连接断开。
3.主机出现大量TIME_WAIT?
主机大量主动关闭了连接(解决方案:减少TIME_WAIT等待时间,套接字设置地址重用选项)。
4.主机出现大量CLOSE_WAIT?
主动关闭方关闭了连接,但是被动关闭方并没有关闭套接字。
5.为什么主动关闭方在发送ACK回复后进入TIME_WAIT状态等待2个MSL才进入CLOSED状态?
被动关闭方在指定时间没有收到ACK回复时,就会重传FIN包,若没有TIME_WAIT等待,而直接关闭socket,这时如果新的连接使用的相同的地址,就会造成重传FIN包发送给新的连接,造成连接紊乱。
所以等待2个MSL是为让所有的数据都消失在网络中,避免对新连接造成影响。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值