一、计算机网络体系结构分层
二、TCP/IP基础
三、传输层中的TCP与UDP协议
1.TCP与UDP的区别
- (1)TCP是面向连接的、可靠地传输协议,UDP是无连接的传输协议。
- (2)TCP存在三次握手、四次挥手、重发机制、拥堵控制等机制保证信息传递过程的可靠性,UDP不存在这些机制。
- (3)TCP用于在传输层有必要实现可靠传输的情况,UDP 主要用于那些对高速传输和实时性有较高要求的通信或广播通信。
2.UDP
3.TCP
(1)TCP报文头
(2)三次握手
- 客户端发送数据包(SYN=1 Sequence number = J),将客户端状态变为SYN_SENT,该数据包意思是请求建立连接
- 服务端接受到客户端发送的数据包(SYN=1 Sequence number = J),发送数据包(SYN=1 ACK=1 Acknowledgment number = J + 1 Sequence number = K),将服务端状态变更为SYN_RECV,该数据包意思是答应客户端的建立连接请求
- 客户端接受到服务端发送的数据包,检查ACK是否为1,Acknowledgment number是哦福为J + 1,确认有效后,发送数据包(ACK = 1, Acknowledgment number = K + 1),将客户端状态变为ESTABLISH,该数据包意思是客户端知道服务端答应了建立连接的请求,可以开始传输数据了
- 服务端收到数据包后,将服务端状态置位ESTABLISH
(3)四次挥手
- 客户端发送数据包(FYN=M),将客户端状态变为FIN_WAIT_1,该数据包意思是客户端没有数据要发送了,请求断开连接
- 服务端收到客户端发送的数据包,将状态变为CLOSE_WAIT,发送数据包(Acknowledgment number = M + 1),该数据包意思是同意客户端断开连接,但是我这边还没有发送完,等我这边消息
- 客户端收到数据包后将状态变为FIN_WAIT_2,等待服务端请求断开连接
- 服务端数据发送完毕后,发送数据包(FIN=N),该数据包表示服务端请求断开连接。
- 客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。
(4)确认应答机制
- 正常情况:发送方发送一个数组包(Sequence number),接收方收到数组包后返回一个确认应答(Acknowledgment number = Sequence number + 1),发送方接受到确认应答,发送下一个包
- 发送方丢包:如果发送方丢包,在一定时间内没有接收到确认应答,则会重发同样的包
- 接收方丢确认应答:发送方发送一个数组包(Sequence number),接收方收到数组包后返回一个确认应答(Acknowledgment number = Sequence number + 1),但是确认应答丢包,发送方等待一段时间后没有收到确认应答,采用重发相同数据包,接收方判断此为相同数据包,会丢弃该数据,但是仍然会发送一个确认应答包
(5)重发超时
- 每次发包时都会计算往返时间及其偏差。将这个往返时间和偏差时间相加,重发超时的时间就是比这个总和要稍大一点的值
- 数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待确认应答的时间将会以2倍、4倍的指数函数延长
- 数据也不会被无限、反复地重发。达到一定重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接。并且通知应用通信异常强行终止。
(6)滑动窗口
1.最大消息长度
在建立 TCP 连接的同时,也可以确定发送数据包的单位,我们也可以称其为“最大消息长度”(MSS)。最理想的情况是,最大消息长度正好是 IP 中不会被分片处理的最大数据长度。
2.滑动窗口
- TCP 以1个段为单位,每发送一个段进行一次确认应答的处理。这样的传输方式有一个缺点,就是包的往返时间越长通信性能就越低
- 为解决这个问题,TCP 引入了窗口这个概念。确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅地缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。
- 窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。上图中窗口大小为4个段。这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。