Tcp协议常见知识
1. Tcp是面向链接的运输层协议,在应用程序使用TCP协议之前,必须先简历TCP连接,传输完毕后,需要断开TCP连接。
2. 每一条TCP连接只有两个端点,每一条TCP连接是点对点的。
3. TCO提供可靠的服务,在使用TCP连接传送数据时,无差错,不丢包,不重复,按序到达。
4. TCP提供全双工通讯,TCP允许通信双方的应用进程在任何时候都可以发送数据,并且在两端都设有发送缓存和接收缓存,来存放通信数据,在发送的时候,数据被传输给缓存后,就可以不再去管它,而TCP会在合适的时候把数据发送出去,接收正好相反。
5. 面向字节流,TCP中的流指的是输入到进程或输出的字节序列,面向字节流的含义是虽然应用程序和TCP的交互是一次一个数据块,但TCP将应用程序交付下来的数据看成一串字节流,不需要去理解其含义,对于字节流的解析由接受方的应用程序自行解析。
源端口和目标端口各占2字节,源端口标识了主机上发起传送的应用程序,而目标端口标识了主机上传送到达的应用程序,这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。
封包序号Sequence Number占用4字节,由于TCP封包必须要放置在IP包中,如果TCP数据太多,则无法全部放到一个IP数据包中,则需要进行分段处理,封包序号就应用于此,可以让接收方将收到的多个数据包重新组合起来。
确认号占用4字节,保存的是期望获得的下一个数据包的编号,如果确认号正确则代表上一个数据包成功接收。
UDP协议常见知识:
用户数据报协议UDP只在IP服务上增加了很少的功能,UDP主要特点是:
1. UDP是无连接的,在发送数据之前不需要建立连接,减少了开销和发送数据之间的延迟
2. UDP是无连接的,不能保证可靠的交付,主机不需要维持复杂的连接状态表
3. UDP是面向报文的,UDP对于应用层交付的报文,不会进行合并或者拆分,而是直接进行添加首部的处理,所以必须选择合适大小的报文,不然会降低IP层的效率。
4. UDP没有拥塞机制,当网络拥塞时不会让源主机发送速率降低,进而保证较小的延迟。
5. UDP支持一对一,多对一,一对多和多对多的交互通信。
6. UDP首部开销小,只有8个字节,而TCP有20个字节。
虽然某些实时应用需要使用没有拥塞机制的UDP协议,但是如果多个源主机多项网络发送高速率的实时视频流时,网络可能会拥塞,进而导致无法接收,因此可能会导致网络拥塞。为了解决这个问题,可以对UDP的不可靠传输进行适当的改进,以减少数据的丢失,可以采用一些增加可靠性的措施,例如采用前向纠错或重传丢失的报文。
TCP与UDP的区别:
1. TCP是面向连接的,UDP是无连接的
2. TCP是可靠传输,UDP是不可靠传输
3. TCP是点对点连接,UDP是一对多连接
4. TCP面向字节流,UDP面向数据报
5. TCP给HTTP, HTTPS, FTP, TELNET, SMTP使用,UDP给DNS, DHCP, NFS, IGMP, TFTP使用
6. TCP首部长度最短20字节,最长60字节,UDP首部长度8字节
TCP可靠传输的方法:
校验和:检测数据在传输过程汇总的变化,如果收到的数据检验和有差错,TCP就会丢弃该数据包,并且不确认收到此数据
确认应答+序列号:TCP给发送的每个数据包进行编号,接受方会根据编号进行排序,将有序的数据传送给应用层,
超时重传:当TCP发送一个数据包后,启动一个定时器,等待接受方确认接收数据包,如果没有在计时器时间范围内收到确认数据包,则会重发该数据包
流量控制:TCP连接每一方都有固定大小的缓冲空间,TCP接收端只允许发送接收端缓冲区能够接收的数据量,如果接收方来不及接收则会降低发送速率,防止丢包,方法为滑动窗口协议。
在TCP的报头信息中,有一个16位的窗口,窗口的大小实际上根据接收端数据缓冲区的剩余大小有关,数字越大,剩余空间越大,网络的的吞吐量越大,接受方在确认应答的时候,将自己的窗口大小写入,一起发送回去。发送方根据ACK报文窗口的大小改变发送速度。如果窗口大小为0,则停止发送数据,并定时探测。
拥塞控制:当网络拥塞时,减少数据的发送,发送方拥有拥塞窗口
如果发送方在开始的时候就发送大量的数据,则如果网络开始的时候就很拥堵,那么拥堵就会加剧,进而导致大量的丢包和超时重传,严重影响效率。因此TCP中引入了慢启动机制,在开始发送数据的时候,先发送少量的数据进行测试,获得当前的网络状态,再决定发送的速率,这就是拥塞窗口机制。拥塞窗口的增长是指数级别的,增长非常块,一直到某个阈值。
TCP的滑动窗口协议对速度的影响
TCP以段为单位进行数据的传输,没发送一个段,就会等待主机对这个段进行ACK应答,而这样就会导致往返时间的增长而降低通讯性能
而窗口可以防止网络性能的下降,应答包不再以段为单位确认,而是以更大的单位进行确认,转发时间会大幅缩短,当发送了一个段之后,不会去等待应答,而是在窗口的限制内继续发送。
窗口大小指的是不需要等待应答就可以继续发送的数据的最大值。
TCP中的粘包和分包
TCP以流的方式处理数据,一个数据包可能会被TCP拆分为多个数据包进行发送,也可能会将多个小的数据包合并为一个大的进行发送,当写入字节大小大于套接字发送缓冲区大小,就会发生拆包现象,而应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,就会发生粘包现象。
解决办法:
包尾增加特殊字符分割:行分隔符类:LineBasedFrameDecoder或自定义分隔符类 :DelimiterBasedFrameDecoder
将消息分为消息头和消息体:LengthFieldBasedFrameDecoder类。分为有头部的拆包与粘包、长度字段在前且有头部的拆包与粘包、多扩展头部的拆包与粘包。
TCP中的三次握手和四次挥手
三次握手:
客户端想要发送连接请求,则首先发送一个请求数据包到服务端,服务端接收到请求数据包后发送一个响应数据包给客户端,表示接收到了请求连接的数据包,然后客户端在发送一个响应数据包到服务端,表示接收到了服务端的反馈数据包,接下来进行数据传送。
使用三次握手的原因是,放置已经失效的请求报文在经过一段时间后又到达了服务端,创建了无用的新的链接。
三次握手的缺陷:如果第三个数据包欸有发送,则服务器资源会被耗尽,解决的办法是使用缓存的方法,确认收到第三个ack后再创建TCP。
四次挥手:
四次的原因:服务端的ACK与FIN必须是分开的,这时一个半连接的状态,服务端可能还会给客户端发送消息