【计算机网络】UDP /TCP协议&三次握手四次挥手

UDP 协议

UDP的特点
传输层协议
无连接:知道对端的IP地址和端口号就直接进行传输,不需要建立连接;
不可靠传输:没有确认机制,没有重传机制,如果因为网络故障该段无法发送到对方,UDP协议层不会给应用层返回任何消息提示
面向数据报不能灵活控制读写数据的次数和数量
面向数据报
应用层交给UDP多长报文,UDP原样发送,既不拆分,也不合并
例如用UDP发送100字节数据:
如果发送端调用一次sendto ,发送100字节,接收端必须调用对应的一次recvfrom,接受100字节,而不能循环调用十次recvfrom,每次接受10字节
UDP缓冲区
UDP没有正真意义大的发送缓冲区,调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续传输动作
UDP具有接受缓冲区,但接受缓冲区不能保证收到的UDP报的顺序和发送的报文的舒徐一直致,如果缓冲区满了,再到达的UDP数据报会被丢弃
UDP的socket既能读,也能写,全双工
注意事项:UDP首部中有一个16位的最大长度,也就是说UDP传输的最大数据是64k(包含UDP首部)如果传输的数据大于64k就需要在应用层进行首东分包,多次发送斌在接收端手动拼装

TCP协议

传输层协议
有连接
可靠传输
面向字节流
TCP协议段格式
在这里插入图片描述
源/目的的端口号:表示数据是从那个进程来到那个进程去;
32位序号/32位确认号:重传机制中保证传输可靠性
4位TCP报头长度:表示TCP头部有多少个62位bit(有多少个4字节)TCP头部最大长度15*4=60
16位校验和:发送端,CRC 校验,接收端校验不通过则数据有问题(校验包括首部和数据部分)
确认应答(ACK)机制
TCP将每个字节的数据都进行了编号,即为:序列号。
每一个ACK都带有对应的确认序列号,意思告诉发送者,我已经接受了那些数据,下一次从哪发。
超时重传机制
在一定时间内,没有收到对方的应答,就会重新发送,当然也有可能是ACK丢失了,所以TCP识别重复的数据,并且把重复的丢掉,利用序列号去重
滑动窗口
解决TCP 传输性能差的缺点(确认应答机制,每发出一个数据段,都要给一个ACK确认应答,导致效率低),也叫快重传
在这里插入图片描述
一次发送多条数据,在收到确认后滑动窗口向后移动,操作系统维护滑动窗口需要开辟发送缓冲区,记录当前有哪些数据没有应答,只有确认应答后才会把数据从缓冲区删除,窗口越高则网络吞吐率越高。
数据到达,ACK 包丢失则可以通过后面的确认序号进行确认(捎带应答),
数据丢失,在收到三次重传该段数据报文时进行重传。
流量控制
接收端处理数据的速度是有限的,如果发送太快导致缓冲区打满,继续发送就会导致丢包,继而引发一系列的连锁反应。
TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制叫流量控制
拥塞控制
解决初始阶段发送大量数据引发连锁反应
TCP引入慢启动先发少量的数据探路,摸清当前网络拥堵状态,在按最大速度传输数据
粘包问题
接受缓冲区的数据是一连串的数据,应用层就不知道从哪里开始哪里结束
解决:对于定常数据,定常读取,对于边变长数据,在包头位加入包长度,或者包与包之间设置明确间隔符UDP不存在粘包问题
TCP异常
进程终止,断电断网,机器关机
接收端进行写操作会发现连接不存在了,就会进行reset操作,
TCP内部有保活定时器,定期询问对方在不在
应用层的某些协议,有检测机制,如HTTP长连接

三次握手四次挥手

TCP连接建立

在这里插入图片描述

建立连接的过程:
调用socket,创建文件描述符
调用connect ,向服务器发起连接请求
connect发出SYN包阻塞等待服务器应答(第一次)服务器知道客户端写功能正常
服务器收到SYN包,会应答一个SYN-ACK包表示同意建立连接(第二次)服务器
客户端知道服务器读写功能正常(服务器接受并响应)
客户端接收到SYN-ACK 后会从阻塞状态返回,同时应答一个ACK包(第三次)服务器知道客户端读功能正常(客户端接收到消息响应ACK)
数据传输过程:
建立连接后,TCP协议提供全双工的通讯服务
while(1)
{
服务器从accept()返回后调用read(),没有读到数据阻塞,反之write()
客户端先write(),然后read();
}
TCP 断开连接:
在这里插入图片描述
断开连接过程:
客户端调用close()关闭连接,客户端会向服务器发送FIN段(第一次)
服务器收到FIN,会回应一个ACK,同时read() 返回0(第二次)
read()返回后服务器知道要断开连接,调用close()关闭连接,并向客户端发送FIN(第三次)
客户端收到后,再给服务器一个ACK段(第四次)

为什么需要三次握手?
为了防止已失效的连接请求报文段突然有传送到服务器,因而产生错误。同时三次握手才可以确认双方都具有读写功能,
为什么需要四次挥手?
客户端关闭连接,只能说明客户端没数据发送,并部表示服务器没有数据要继续发送。
四次挥手状态变化:

在这里插入图片描述 客户端请求关闭连接发送FIN端后处于FIN_WAIT_1状态,半关闭状态,CLOSE状态才会正在关闭连接