目录
一、UDP协议
1.UDP特点
1.无连接:知道对方的IP地址和端口号就直接进行传输,不需要建立连接
2.不可靠:没有确认应答机制、超时重传;如果因为网络故障导致该段无法发送到对方,UDP协议也不会告诉应用层(不会返回错误信息)
3.面向数据报(每一个报文就是一个独立的个体)应用层交给UDP多长报文,UDP就发多少,不会拆分,也不会合并
- 比如 用UDP传输50个字节的数据
- 发送:它就调用一次sendto,发50个字节,因为UDP没有真正的发送缓冲区,所以调用sendto会直接交给内核,再由内核交给网络层协议进行后面的传输
- 接收:接收端也调用一次recvfrom,接收50个字节,而不是循环调用5次,每次接收10个字节
- UDP具有接收缓冲区,但接收缓冲区不能保证收到的UDP报的顺序跟发送的UDP报的顺序一致,如果缓冲区满了,再到达的UDP数据就会被丢弃。
2.协议格式
- 16位UDP长度:表示整个数据报的最大长度
- 数据报(报头+数据(有效载荷))
- 如果我们传输的数据超过16*4k=64k,就需要在应用层手动的分包,多次发送,并在接收端手动拼装
二、TCP协议
1.TCP的特点
有连接、可靠传输、面向字节流(想收多少就收多少)
PS:UDP中,定长将报头和有效载荷分离;TCP中,4位首部长度将报头和有效载荷分离
2.协议格式
源/目的端口号:表示数据从哪个进程到哪个进程
6个标志位:(通过标志位确认是否建立连接)
URG 确认紧急指针是否有效
SYN 请求建立连接(发送)
ACK 确认号是否有效(回复)
RST 重新建立连接(重建)
FIN 通知对方,本端要关闭了(结束连接)
PSH 提示接收端立刻从TCP缓冲区中把数据拿走
3.TCP保证可靠性
校验和
接收端校验不通过,认为数据有问题,这里的校验和包括TCP首部和TCP数据部分
32位序号/32位确认序号
保证数据按序到达,能确认哪些报文被接收(去重)
确认应答
发送者发的每个字节的数据都有编号,也就是序列号,接收者接收后会回复(ACK里带有确认序列号)告诉发送者,我已经收到了哪些数据,下一次从哪里开始发
超时重传
如果主机A给主机B发数据,在一定时间内,A没有收到B的应答,A就会重新发送
发送失败的原因可能是:
1.网络拥塞
2.主机B收到消息,在回复的路上,ACK丢失等原因
- 超过一定的时间:一般以n*500ms为一个单位ps累计一定次数,TCP认为网络或者对端主机出现异常,就强制关闭连接了
- 如果是情况2,B收到数据,但在回复的路上将ACK丢失了,当A再重传时,B会收到重复的数据(因为TCP报头中有序列号,B能确认哪些是重复的),就把重复的数据丢弃了
连接管理
正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接
流量控制
根据接收端的处理能力,来决定发送端的发送速度
因为接收端处理数据的速度有限,如果发送端发的太快,导致接收缓冲区满了,继续发送就会导致丢包,则会引起丢包重传等一系列连锁反应
拥塞控制
- 开始发送数据时,我们并不知道网络状态,网络上有很多计算机,可能当前网络状态就比较拥堵,如果最开始就发送大量数据,就可能引起网络拥堵等连锁反应
TCP可以通过慢启动,先发少量数据探路,等摸清当前的网络状态,再按最大速度传输数据
滑动窗口=拥塞窗口>接收窗口?接收窗口:拥塞窗口
4.提高性能
滑动窗口
引入原因:一发一收(确认应答)的方式性能太低
-
一次发多条数据(也就是将多个段的等待时间重叠在一起)就能大大提高性能
-
窗口大小指无需等待确认应答而可以继续发送数据的最大值(上图窗口大小为4,是4个段,4000个字节)
-
收到一个确认应答后,滑动窗口向后移,继续发送第五个,依次类推
-
操作系统内核维护这个滑动窗口,开辟发送缓冲区来记录还没有应答的数据,只有确认过应答的数据,才能从缓冲区删掉
-
窗口越大,网络的吞吐率越高
-
丢包的两种情况:
1.数据包到达,部分ACK丢失,可以通过后面的ACK确认(捎带应答)
2.数据包直接丢失,收到三次同样的确认应答时进行重传(少于三次就是超时重传了,这也叫快速重传) PS 收到的是四次ACK,第一个是正常的,后面三个是冗余的
捎带应答、 快速重传
三、TCP的粘包问题
这里的"包",是指应用层的数据包,UDP不存在粘包问题,它面向数据报,每一个报文就是一个独立的个体,是一个个把数据交付给应用层,有很明确的数据边界,应用层使用UDP时,要么收完整的报文,要么不收
- 虽然传输层看到TCP是一个个报文过来的,并按序排好放在缓冲区中,但应用层看到的只是一串连续的字节数据,所以应用程序看到是一个完整的应用层数据包,不知道从从哪开始到哪结束
解决:
- 对于定长的包,定长读取
- 对于变长的包,可以在包头位置约定一个包总长度或者在包和包之间使用明确的分隔符
四、TCP异常情况
进程终止、机器重启:释放文件描述符,仍然可发FIN,和正常关闭一样
机器断电、断网:接收端有写入操作时发现连接不在了,会进行reset操作。TCP内有保活定时器,即使没写入操作,也定期询问对方在不在,不在就释放连接。(应用层的某些协议也有检测机制,egHTTP长连接中,也会定期检测对方的状态)