一. ip协议
ip协议是TCP/IP协议族的动力,它为上层协议提供无状态,无连接,不可靠的服务。
1. 特点
- 无状态: ip通信双方不同步数据的状态信息,因此所有IP数据报的发送、传输和接收都是相互独立,没有上下文关系的;
缺点:无法处理乱序和重复的IP数据报;
有点:简单,高效。 - 无连接:是指IP通信双方都不长久的维持双方的任何信息,这样上层协议每次发送数据时,都必须指定IP。
- 不可靠:指IP协议不能保证IP数据报准确的到达接收端,它只是尽最大努力交付。
2. IPV4头部结构
长度20个字节
ip.png
- 4位版本号(version): 指定IP协议的版本。对ipv4来说是4. 其他IPV4协议的扩展版本则具有不同的版本号,如SIP协议和PIP协议,且他们的头部结构也不同。
- 4位头部长度: 标识该IP头部有多少个32bit(x86数据总线宽度32位),4位最大值是15,所以IP头部最长是60字节
- 8位服务类型:一般不用
- 总长度: 指首部和数据之和的长度,单位为字节。总长度为16位,因此数据报的最大长度为65535字节;在IP层下面的每一种数据链路层协议都规定了一个数据帧重的数据字段的最大长度,这称为最大传送单元(MTU), 当一个IP数据报封装成链路层的帧时,此数据报的总长度一定不能超过下面的数据链路层所规定的MTU值。
- 标识:占16位,IP软件在存储器中维持一个计数器,没产生一个数据报,计数器就加1,并将此值赋给标识字段。分片报文具有相同的标识字段。
- 标志:占3位,目前只有前两位有意义, MF ,DF
- 片偏移: 占13位,片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。片偏移以8字节为单位。也就是说,每个分片一定是8字节的整数倍。
- 生存时间:占8位,现在表示跳数限制,指明数据报能在互联网中经过多少个路由器。
- 协议: 指出数据报携带的是何种上层协议。
- 首部检验和:占16位,这个字段只检验数据报的首部,但不包括数据部分。
- 源地址:占32位。
- 目的地址:占32位
- 可变部分:通常路由器不支持该部分。
二. TCP协议
1. 特点
- 面向连接的传输层协议:应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。
- 每一条TCP连接只能有两个断点, 点对点,一对一的
- TCP提供可靠交付的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,并且按序到达
- TCP提供全双工通信,TCP允许通信双方的应用进程在任何时候都能发送数据;TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。在接收时,TCP把收到的数据放入缓存,上层应用进程在合适的时候读取缓存中的数据
- 面向字节流:虽然应用程序和TCP交互是一次一个数据库(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构字节流。
2. TCP报文首部格式
tcp首部最小长度是20个字节
tcp.png
- 源端口和目的端口:各占2个字节
- 序号:占4字节,范围0 - 2^32-1 , 在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,首部中的序号表示本报文段所发送数据的第一个字节的序号
- 确认号:占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号
- 数据偏移:占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段其实是指出TCP报文段的首部长度
- 保留:占6位
- 紧急: 优先传送该报文
- 确认ack: 仅当ACK=1时确认号字段才有效。当ACK为0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1
- 推送PUSH : 很少用
- 复位RST : 当RST=1时,表明TCP连接中出现严重差错(由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接。
- 同步SYN : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段,对方若同意连接,则应在响应的报文段中使SYN=1,ACK=1, 因此,SYN=1表明这是一个连接请求或连接接收报文
- 终止FIN: 用来释放一个连接,当FIN=1时,表明此报文段的发送方的数据已经发送完毕,并要求释放运输连接。
- 窗口:占2个字节,最大值是2^16-1, 窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口值作为接收方让发送方设置其发送窗口的依据
- 检验和:占2个字节,检验和字段检验的范围包括首部和数据两部分
- 紧急指针
- 选项 : 长度可变,最长可达40字节
2. TCP常用算法
Nagle算法:若发送应用进程把要发送的数据逐个字节地送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来。当发送方收到对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。只有在收到对前一个报文段的确认后,才继续发送下一个报文段。当数据到达较快而网络较慢时,用这样的方法可明显减少所用的网络带宽。Nagle算法还规定,当到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段。
3. TCP拥塞控制
3.1 拥塞控制
拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不至过载。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器以及与降低网络传输性能有关的所有因素。
- 开环控制:在设计网络时事先将有关发生拥塞的因素考虑周到,力求网络在工作时不产生拥塞,但一旦整个系统运行起来就不再中途改正了。
- 闭环控制:是基于反馈环路的概念。
a. 监测网络系统以便检测到拥塞在何时、何处发生;
b. 把拥塞发生的信息传送到可采取行动的地方;
c. 调整网络系统的运行以解决出现的问题。
3.2 拥塞控制算法
慢开始、拥塞避免、快重传、快恢复
拥塞窗口:发送方维持一个叫做拥塞窗口的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态变化。发送方的发送窗口等于拥塞窗口。
3.2.1 慢开始及拥塞避免
-
慢开始:比如发送方初始的拥塞窗口为1MSS, 则慢开始阶段的窗口变化为1*2^n (每经过一个传输轮次RTT), 慢开始其实并不慢,指数级增加。
-
慢开始门限:为了防止拥塞窗口cwnd增长过大引起网络拥塞;
当cwnd < ssthresh 时,使用上述的慢开始算法;
当cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法;
当cwnd= ssthresh时,都可以使用。 -
拥塞避免算法:是把拥塞窗口控制为按线性规律增长,使网络不容易出现拥塞。
当网络出现超时,发送方判断为网络拥塞,此时设置:
ssthresh=cwnd/2
拥塞窗口cwnd=1, 重新进入慢开始。
3.2.2 快重传
- 当发送方一连收到3个对同一个报文段的重复确认,立即进行快重传。
- 采用快速重传算法可以让发送发尽早知道发生了个别报文段的丢失。
- 快速重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认。
3.2.3 快恢复
当发送方发生了快速重传,知道了现在只是丢失了个别的报文段,于是不启动慢开始,而是执行快恢复算法。
- 发送方调整门限:ssthresh = cwnd/2
- 设置拥塞窗口: cwnd = ssthresh = 8, 并开始执行拥塞避免算法。
3.2.4 超时重传与TCP缓冲区
-
超时重传:对发送方来说,发出去的包不像往常一样得到确认,如果迟迟收不到,就认定包已经丢失,只能重传了。从原始包发出到重传该包的这段时间称为RTO.
-
超时重传对性能的影响最大,因为它有一段时间RTO没有传输任何数据,而且拥塞窗口会被设成1个MSS.
-
带宽时延积决定了TCP缓冲区的大小,也决定了发送窗口的最大大小。带宽100MB/S,网络实验10ms,带宽时延积1MB;也是飞行报文的大小。
发送窗口也决定了飞行报文的上限;
通常linux使用TCP缓冲区动态调节功能。
网友评论