TCP和UDP
tcp和udp是传输层协议,我们日常的网络通讯都是通过这两种协议来传输数据的。他们都是在文件间传送数据,数据可以是各种文件(txt,jdg,mp4等等都可)传输的都是二进制数。
TCP协议
tcp全称为传输控制协议,是面向连接的可靠传输协议。
tcp保证面向连接要有三个步骤,分别为三次握手、传输确认、四次挥手,促使在不可靠的信道上建立可靠的连接。
三次握手
三次握手是为了建立稳定可靠的连接。
当客户端向服务端发起连接时,会先发一个请求连接的SYN数据包进行询问,服务端收到后如果可以建立连接则会回复SYN+ACK包,客户端收到后再回复一个ACK包,连接成功建立。
为什么不是两次握手而是三次握手?
为了解决网络信道不可靠的问题,防止客户端发送SYN请求包时中途失效,突然又恢复传到服务端引起错误。
建立起连接后,客户端和服务端进入了数据传输状态
传输确认
可靠传输的四种传输机制:确认 排序 流控(滑动窗口) 重传
确认重传机制:在发送一个数据之后,就开启一个定时器,若是在这个时间内没有收到发送数据的ACK确认报文,则对该报文进行重传,在达到一定次数还没有成功时放弃并发送一个复位信号。
**排序:**为了解决丢包问题。TCP为每个连接建立了一个发送缓冲区,建立后的第一个字节为0,后面每个字节的序列号就会增加1,发送时,取一部分数据组成发送报文,在其TCP协议头中会附带序列号和长度,接收端收到后,需要回复确认报文。确认报文的ACK等于接受序列号+长度。也就是下一包数据需要发送的起始序列号,这样就可以和之前的包衔接上,一次性发送连续的多包数据。接收端只需要回复一次ACK就可以了。如果中间出现了丢包问题,接收端请求发送端发送对应缺失的ACK报文即可。
流控(滑动窗口):应对网速变化,提速测试,缺失降速,无丢包提速。
四次断开
客户端和服务端都可以关闭连接请求,所以需要四次挥手来关闭连接请求。
假设是服务端关闭连接请求,他需要向客户端发送一个关闭请求的FIN包,表示关闭连接,自己进入中止等待1状态,这是第一次挥手。
客户端收到FIN包,发送一个ACK包,表示自己进入了关闭等待状态,服务端进入中止等待2状态,这是第二次挥手。
客户端此时还可以发送未发送的数据,而服务端还可以接收数据,待客户端发送完数据后,发送一个FIN包,进入最后确认状态。这是第三次挥手。
服务端收到之后回复ACK包,进入超时等待状态,经过超时时间后关闭连接。而客户端收到ACK包后,立即关闭连接。这是第四次挥手。
为什么服务端要等待超时时间?
和三次握手一样,这是为了保证对方已收到ACK包,假设服务端发送完最后一个ACK包后就释放了连接,一旦ACK包在网络中丢失,客户端将一直停留在最后确认状态,如果服务端发送最后一个ACK包后,等待一段时间,这时客户端因为没有收到ACK包,会重新发送FIN包,服务端会响应这个FIN包,重发ACK包并刷新超时时间。
UDP协议
UDP全称为用户数据报协议。是非面向连接的协议。发送数据就是简单的进行封装,然后发送就可以了,数据包没有状态上的联系。
因为发送形式简单,所以其CPU,内存资源的占用远小于TCP,性能损耗小,但由于不可靠,会产生丢包,因此在传输稳定性上弱于TCP,因此适用于一些对丢包没有太大要求的地方,比如通话、直播等。
|