网络通信----传输层:负责端与端之间的数据传输----TCP/UDP

传输层:负责端与端之间的数据传输----TCP/UDP


       一、  UDP:
          UDP协议:无连接,不可靠,面向数据报(不会产生粘包问题)
          UDP协议报头:源端口,目的端口,数据包长度,校验和
          
          校验和:二进制反码求和
          
          面向数据报不会产生粘包问题:因为UDP数据包中自定义了数据包的长度
          udp数据包最大长度64K(包含报头);
          若用户sendto发送的数据长度大于64k则会报错:因为udp在传输层不会自动进行数据分段
          
          数据报长度是一个uint16_t类型的数字,这就决定了数据报最大长度64k;数据长度就是64k-8
          意味着如果传输的数据若大于64k,则需要用户在应用层就进行数据分段;
          但是传输层udp并不保证数据的有序到达,因此需要用户在应用层进行包序的管理
          
          udp场景:实时性较高
          udp协议内部实现了广播功能--udp广播
       二、TCP: 
          TCP协议:面向连接,可靠传输,面向字节流
           TCP连接管理:
              TIM_WAIT:假如没有TIME_WAIT状态,主动关闭方直接进入CLOSED,如果立即重启客户端
           使用相同的端口,在最后一次ACK关闭失效以后,服务端重新发送FIN请求,就会被新启
           动的客户端收到;或者新启动的客户端发起请求的时候,因为服务端正在等待最后一次ACK
                       因此新连接请求发送的SYN就会被认为请求码错误,服务端就会恢复RST重置连接
           因此需要主动关闭方发送最后一次ACK之后进入一个TIME_WAIT状态等待一段时间:2个MSL
           MSL:最大报生存周期
           1.等待这段时间就是为了若接收到重发的FIN请求能够进行最后一次ACK回复
           2.让在网络中延迟的FIN/ACK消失在网络中,不会对后续的连接造成影响
           
           TCP的可靠传输
              确认应答机制/超时重传机制,协议中的序号/确认序号, 校验和 
              
              确认应答机制:超时重传机制-保证数据安全到达
              协议中的序号/确认序号:进行包序管理
              校验和:验证数据的一致性
            tcp为了实现可靠传输,牺牲了部分性能;因此又引入了各种机制来针对不同场景提高传输性能
            
            滑动窗口机制:流量控制
                滑动窗口规定:
                (1)ack确认丢失的情况:每条数据都要进行回复,并且应该按顺序逐条回复,如果没有收到第一条,
            但是都到了第二条,第二条就不能先回复,应该先回复第一条;带来的好处就是,因为第一条ack
            丢失后,如果发送端收到第二条回复,也会认为第一条正常接收,第一条就不需要重传了
            
                (2)数据丢失的情况: 当数据连续发送N条,但是第一条数据丢失,接收端先接收第二条,这
            时候接收端认为第一条数据有可能丢失,因此直接开始向发送端发送第一条的数据重传请求;连续发
            三次(防止网络延迟又接收到数据报);当发送端接收到三条重传请求,则会对这条数据进行重传
            
            滑动窗口
                通信双方通过协议中的窗口字段,来协商能够一次发送的最多的数据,然后连续发送多条数据;
             在socket中使用两个指针维护窗口前沿和后沿
               发送端:发送的起始位置-后沿,前沿就是发送的结束位置;--若窗口后沿数据没有接收ack确认,
            后沿不能移动,数据就不能从缓冲区移除,接收到ack确认后就会让后沿向后移动
               接收端:接收数据的起始位置-后沿,接收的结束位置-前沿;当接收数据的时候若没有接收到
            第一条数据,则后沿不能动,只有接收到数据后,后沿才会向前移动
            
            产生的问题: 滑动窗口机制,通过窗口大小来确定连续发送多条数据;但是一开始通信的时候,因为不
            了解网络状态,有可能造成发的越多,丢的越多,超时重传就越多,降低效率
            滑动窗口机制中的拥塞窗口:定义一个拥塞窗口限制通信起始时候,数据的发送速度,以及一个阈值(窗口大小)
            控制增长上限;在通信中以慢启动,快增长的形式尽力避免因为网络状况不好导致的丢包发生
            
          tcp提高传输性能的机制
            延迟应答机制:尽可能的保持窗口大小,保持网络传输吞吐率
            捎带应答机制:尽量减少不必要的确认应答报文(在发送数据的时候顺便对上一次的请求进行ACK回复)
            
           tcp面向字节流
            传输数据并不关心是什么数据,只管二进制的数据流        
            tcp粘包问题:缓冲区的数据对于tcp来说没有边界;造成数据粘连的问题
            本质问题:数据没有边界
            需要在用户在应用层进行边界管理:
                特殊字符间隔(http协议)
                定长数据
                变长数据(udp中包含数据长度)
            **udp不会产生粘包问题    


          TCP协议字段:
             16位源端口/目的端口;
             32位序号/确认序号;
             4位头部长度;
             6位标志位:(URG/AKC/PSH/RST/SYN/FIN)    
             16位窗口大小;
             16位校验和;
             16位紧急指针;
             40字节的选项数据(MSS)
         TCP的连接断开:
             进程退出,会进行四次挥手断开连接流程
             关机,会进行四次挥手断开连接流程
             网线断开/断点:tcp内部实现保活机制keep—alive,长时间无通信则进行网络探测;
             连续多次进行探测无响应,认为连接断开;外在表现:recv 返回0/send 发生异常--SIGPIPE-导致进程退出
       基于tcp的应用层协议:http/https/ssh/telnet

你可能感兴趣的:(linux,网络)