一、udp协议
udp是传输层(进程到进程)的协议,是面对数据报,无连接,不可靠
以下为udp协议的形式:
16位udp长度,表示整个数据报(udp首部+udp数据)
udp是定长的包头,方便进行解包
校验和:发送端(udp):按照cpc算法,将内存计算出checksum值,记为n1,填充到包头中,
接收端(udp) 接受数据,计算n2,如果n1!=n2说明数据不同,直接丢弃,如果相等则大概率数据是正确的,可以正常交付。
实现步骤:
1、socket 有本地端口 填写 源端口
2、根据packet的端口,填写目标端口
3、填写数据长度
4、计算checksum值填写
5、直接给网络层
1、解包
2、根据目标端口。找到对应的pid,如果没有丢弃
3、计算checksum值,如果不同且丢弃
4、把应用层的数据切割出来,交付给接收者进程
二、tcp协议(有传输、可靠、面向字节流)
可靠性:①尽最大可能把数据传输给对方 ② 即使没有发送成功,要向上一层报道
③保证收到的数据是有序的④保证不会收到错误数据⑤根据接收能力和网络承载能力做出发送量的控制
tcp实现可靠的第一个功能就是确认应答如下:接收了指令,要向对方有个确认收到的应答信息
完成确认应答就是对数据进行编号,每个字节占给一个编号
发送端发送 SN=开始序号,数据长度 对方接受到了,要发ASN(确认序号)=开始序号+数据长度的下一位序号
这样就可以解释32为序号(携带发送数据的序号)和32位确认序号(携带确认应答序号)
还可以解释 六个标志位中的ACK:ACK为1表示是除了携带数据以外还携带了确认序号 为0则是没有携带确认序号
完成确认应答还有一个是超时重传机制: 当没有收到确认收到的信号,等一会在重新发数据
图如下:
超时时间选定:超时时间既不能太长也不能太短,Linux中超时以500ms为一个单位 ,每次判断超时时间为500ms的倍数(如果重发一次后,仍然没有收到则等待2*500ms再次重发)
发现网络故障的时间为:1+2+4+8s
三、tcp连接管理(tcp连接管理(三次握手)+正式数据连接+四次挥手)
tcp有发送缓冲区和接收缓冲区
tcp正式发送数据时,需要确认对方是否存在,是否可以接受数据(准备建立阶段)
三次握手(可以把确认序号跟信息一起传递)图如下:
就可以解释syn标志位:为同步的意思
从过程可以看出tcp的状态:
colsed:已关闭 listed:被动连接方等待连接 syn_sent:已发送同步 established:已建立
四、tcp断开(四次挥手)
挥手的tcp状态图如下:
可以接受标志位FIN的意思:结束信号 (fin=1 携带着要去结束信息)
FIN_WAIT(等待被动断开方的fin状态) CLOSING(处于正在断开连接的状态) CLOSED(处于断开连接的状态)
CLOSE_WAIT(是在挥手阶段,被动断开方的状态,状态为接收到了fin请求关闭信息,但还没有准备关闭的状态) (服务器中出现大量的CLOSE_WAIT是不合理的,很大可能是忘记写socked.close())
TIME_WAIT(在挥手阶段,主动断开方的状态,状态为接收到了被动断开方的ack+fin,之后要等待一段时间,时间过了发送ack给被动断开发,断开方位closed状态,这段等待的时间的状态就位TIME_WAIT)
为啥要有这个状态为啥不直接处于关闭状态:tcp是靠五元组进行连接的,直接进入closed状态,不知道再用相同五元组建立的新的连接时发送的数据是之前的连接还是新建立的连接,还有就是确保最后的ack不会丢失。
可以看看以下的图像进行分析:
服务器中出现很多TIME_WAIT状态的连接,是合理的,但是不处于CLOSED状态,这个连接中的数据就不能释放,数据无法别使用,最好不要有太多TIME_WAIT
以上的都是正常断开连接,tcp还支持异常的断开连接:
1、tcp直接断开连接(rest sagment)就可解释标志位中的RST
2、通知进程(进程接收到了异常)
3、tcp异常:①进程终止:会释放资源,仍然会发fin,跟正常的挥手一样
②机器重启:跟进程终止一样 ③断电,断网:什么都来不及执行(既不是正常关闭也不是异常关闭,内存数据丢失,没有连接这个事)(接收端认为连接还在,就会发送数据,发现对方不在了,执行rest操作;另外tcp内部也设置了保活定时器,判断对方是否在,应用层HTTP协议长连接也会定期检查对方是否存在)
五、流量控制:
流量控制:要看对方接受能力(流量控制)和网络承载能力(拥塞控制),进行发生量的控制
一、流量控制:
接收窗口:对方接受能力
怎么看对方的接受能力:tcp都有接受缓冲区(接受到数据并且没有被应用层拿走最大位900个字节) 接受能力就是看接受缓冲区还剩下多少空间
那怎么告知给发送方呢:每一个segment都会携带16位控制窗口信息,发送方不断收到segment即可知道,并随时更新。
发送在知道发送量的限制后,以滑动窗口机制
①从可用空间中(发送缓冲区)是写入要发的数据
②知道对方的接受能力,确定接收窗口
③确定要发送的,要发生但暂时不能发送
④发送过去了未确认,未发生
⑤已确认发送成功,发送未确认,和要发送的
就跟窗户一样。
二、拥塞控制:
拥塞窗口:网络承载能力
不能具体算出数据,但是可以用一定的算法推算:网络拥塞算法
1、慢开始:假设承载能力很低(cwnd=1)
2、快启动:先cwnd=cwdn*2 到了初始ssthresh值再cwdn=cwdn+c
3、敏感:一旦遇到网络拥塞 ssthresh=cwdn/2 cwdn=1;