javaweb的相关知识

TCP和UDP的相关知识

TCP和UDP 都是传输层协议,二者都是基于socket编程,但是二者的API不太一样
TCP和UDP之间的区别
1.TCP 有连接的传输,而UDP时无连接的传输
2.TCP是可靠传输,而UDP是不可靠传输
3.TCP是面向字节流,而UDP是面向数据报
4.TCP提供了拥塞控制,滑动窗口等级制来保证传输的效率,UDP却没有
共同点:二者都是全双工传输

关于TCP的三次握手和四次挥手

建立连接-三次握手
在这里插入图片描述
1.第一步:客户端向服务器发送一个SYN报文请求建立连接,
其中syn报文的功能就是尝试建立连接。
2.第二步:服务器向客户端返回一个SYN+ACK报文,其中包含了两层含义,一是,服务器收到了客户端请求建立连接的讯息(ACK),并且尝试向对方建立连接通讯(SYN)。
3.第三步,客户端向服务器发送一个ACK报文,表示收到服务器的请求,并同意建立连接。
三次握手必须是三次,才能完全确认通信双方的发送数据的能力和就收数据的能力。
其中accept发生在三次握手之后,accept会查看队列是否为空,如果为空就会阻塞,当队列非空的时候,就会从已完成队列中取出一项并返回,已完成队列都是在三次握手已经完成的,所以accept是在三次握手之后发生。

断开连接-四次挥手
在这里插入图片描述
1.客户端向服务器发送一个FIN报文,请求断开连接。
2.服务器收到FIN就会返回一个ACK 确认序号为接受序号+1。
其中上图中的close_wait 状态表示,服务器收到FIN也返回ACK,但是服务器是否要发送FIN,还需要等待积压的数据处理完毕
3.服务器将积压的数据处理完成,就会返回一个FIN表示请求断开连接
4.客户端返回ACK表示收到信息
为什么连接时候是三次握手,断开连接的时候是四次挥手呢?
当服务器给客户端发送ACK+SYN的时候是同步的操作所以可以直接发送,但是断开的时候,当收到FIN的时候不会直接关闭socket,而是先告诉客户端“我收到你的FIN报文了,但是得等我将所有报文发送完才能发送FIN报文”,所以不能一起发送,因此需要四次,但是考虑到捎带应答的情况可能会是三次,但是大多数情况下是四次。
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
理论上来说,当我们断开连接之后就会进入close状态了,但是实际上网络是不可靠的有可能会丢包,而TIME_WAIT状态就是用来重发丢失的ACK报文,而且2MSL就是一个发送和回复的最大值,这就减少了丢包的概率。
为什么不能用两次握手进行连接?
因为3此握手就是为了让通信双方,确认对方的发送和接受数据的能力,即就是验证双方的读写能力,而且可以协商重要的数据,如果是两次就有可能另一方无法的到相应的信息,所以必须是三次。

TCP的可靠性

1.确认应答:每一个确认报文中都会有一个确认序号(确认之前的数据,已经正常发送了)
2.超时重传:如果当数据包丢了,就会在一定时间重新发一次数据
3.连接管理: 三次握手,四次挥手
4.滑动窗口:
因为前面的效率太低了,所以引入滑动窗口,即就是批量发送,相当于用一份时间来等待多份数据的ACK,窗口的含义就是发送多少的的数据无需等待,数据大小就是窗口。
其中就会有可能会丢包
a如果是ACK丢了,就无关紧要了,因为后一个ACK就包含了之前的ACK,反而会提高数据的传输效率
b.如果是数据报丢了,就会触发快速重传,因此一般的发送报的报文问就会有推荐滑动窗口的大小来提升效率。
5.拥塞控制
在这里插入图片描述

拥塞控制:即就是刚开始传输数据的时候,就会采用一个试探性的窗口,如果发小没有低保,就会尝试加大窗口大小,显示线性增长,如果发现出现丢包,就会减少窗口,最终达到动态平衡,而窗口大小就是有拥塞控制和流量控制来决定。
6. 流量控制
流量控制,就是接收方的ACK上会携带建议的窗口大小,发送方就会按照这个来调整,这个大小就是接收方缓冲区的空余空间大小、7.延时应答
为了提高程序的执行效率 一般的服务器就是典型的一问一答,延时应答就会系那个这些应答过程合并成一个
8.捎带应答
在延时应答的基础上,进一步提高效率,把上一个ACK和下一个数据结合到一起发送(四次挥手也就很有可能是三次握手)。
9.面向字节流
面向字节流像水流一样,读写数据的时候,可以一次读写一个字节,也可以一次读写两个字节,也可以读N个字节~
10.保活机制
TCP的异常情况 ;主机重启
如果掉电,A就不会给B发数据,B还是在等A的数据
此时TCP内置了一个定时器这个定时器会周期性的给对方发送一个心跳包
若A收不到B 的心跳包那么就会触发复位连接流程(RST)在此链接,就会放弃连接;

TCP状态

1.LISTEN
当服务器启动完毕,准备就绪,可以有客户端建立连接。
2.ESTABLISHED
客户端连接成功了,随时可以发送给信息了
3.CLOSE_WAIT
四次挥手被动断开的一方,客户端断开连接,另外一方就会进入CLOSE_WAIT 来处理积压的数据。
4.TIME_WAIT : 主动断开链接的一方就会进入TIME_WAIT目的是为了最后一个ACK如果丢包,就会通过这个状态来进行重传,存在的时间就是2*MSL (MSL就是网络上一次传输数据的最大时间),结束后就会进入CLOSED状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值