1. UDP协议
职责:在网络层的基础上,实现了进程to进程的通信
UDP协议的包头信息:UDP添加的封装(解包、分用)
发送:1.填充端口
2.计算长度+填充长度
3.计算机checksum+填充checksum
4.立即将数据交给网络层
接受:1.从网络层接受数据
2.通过计算校验和,检查数据是否出现错误了,如果错误直接丢弃
3.数据没有错,根据自己内部的维护Map<port,pid> 找到对应的接收进程。如果找不到,直接丢弃
4.看对应的进程是否准备好一块内存,如果暂时没有,需要暂时把数据保存一段时间
5.把数据复制到对应的内存空间byte[] buf
UDP的特点:
不可靠:没有任何安全机制,发送端发送数据报以后,若因为故障无法发送,UDP协议不会给应用层返回任何信息;
无连接:知道对端的IP和端口号就直接进行传输,不建立连接;
面向数据报文:应用层交给UDP多长的报文,UDP原样发送,不拆分不合并;
大小受限:16位最大长度,也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。
UDP只有接收缓冲区没有发送缓冲区。
2. TCP协议 :传输控制协议
1.进程to进程 2.可靠(并不是安全!!)
2.1 TCP协议格式:
2.2 TCP的保证“可靠性”
2.如果真的遇到发送不过去的情况,TCP至少会告诉发送进程,数据发送失败了
3.保证不会收到错误的数据(通过checksum)
4.TCP能保证收到的数据一定是有序的(按照发送进程发送时的顺序)
5.TCP会根据对方的接受能力和网络线路的承载能力,进行流量控制
2.3 TCP做了哪些机制来保证可靠性
1.确认应答机制(安全机制):接收方(对方的TCP)有责任对收到的数据进行确认应答
①确认段:一份数据既可以当发送的,也可以起到确认的角色
②发送:携带有数据,填写正确的SN,就是发送segment
③确认:标志位ACK置1,代表起到了确认的作用,需要填写确认序列号(ASN)
④确认序列号:填写下一次期望收到的第一个字节的编号,换言之,ASN之前的数据已经全部收到了
⑤TCP维护着各自的发送SN
2.TCP超时重传机制(安全机制): 主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B;如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发; 但是,主机A未收到B发来的确认应答,也可能是因为ACK丢失了。TCP的发送端不用关心超时没有收到应答的原因是什么,采用统一的超时重传机制即可,如果接收端真的收到了重复的数据,TCP协议需要能够通过序列号识别出重复的包,直接丢弃即可。
1.TCP关闭本次连接
2.TCP会通知进程(IOException)
3.TCP会发送一个reset segment出去
进程:作为TCP的发送方,经过一段时间之后,是可以知道线路有问题的
作为TCP的接受方,无法得到线路有问题(不能确定对方是没有发送数据还是发送失败了)
连接管理机制(安全机制):TCP需要三次握手建立连接,四次挥手断开连接
三次握手和四次挥手(面试必问) - My_Dreams - 博客园 (cnblogs.com)
1.TCP有没有发送缓冲区
有、发送数据之后不可以直接丢弃,需要重发,所以至少需要一个地方保存这些数据
2.TCP有接收缓存区
3.TCP得维护发送时的序号SN= x,才可以用于发送时填充SN字段
TCP得维护已经接收的数据的信号ASN=y,才可以进行去重
?为什么TCP要设计连接?
1.必须确认对方的存在,才能“可靠“地传输
2.交换一些必要的数据:SN不是直接从1开始的,会双方各自随机生成,随后需要交换
滑动窗口机制(效率机制):一次发送多条数据提高性能
1.窗口大小指的是无需等待确认应答可以直接发送数据的最大值
2.窗口大小为n个字节(n个段),表示发送前n个段时,不需要等待任何ACK后,直接发送
3.收到第一个ACK以后滑动窗口向后移动,继续发送第n+1个段的数据,以此类推
4.操作系统内核为了维护这个滑动窗口,需要开辟 发送缓冲区来记录当前还有哪些数据没有应答
5.只有确认应答过的数据,才能从缓冲区删掉
6.窗口越大,则网络的吞吐率就越高
流量控制(安全机制):接收端处理数据的速度有限,发送端发送太快接收端的缓冲区直接被打满,此时发送端继续发送就会丢包,因此TCP支持根据接收端的处理能力,来决定发送端的发送速度,让发送端发送数据的速率不要太快让接收端来的及接受,这就是流量控制。
1.接收端将自己可以接收的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK通知发送端
2.窗口大小字段越大,说明网络的吞吐量就越高
3.接收端发现缓冲区快满了,就将窗口大小设置成一个更小的值通知给发送端
4.发送端接收到这个窗口后就减慢自己的发送速度
5.接受缓存区满了以后,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。
拥塞控制(安全机制):网络上有很多计算机很可能刚开始网络就已经比较拥堵,此时再发送大量数据更堵塞,拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或者链路不过载。因此TCP引入慢启动机制,先发少量数据摸清当前网络拥堵状态,再决定按照多大的速度传输数据。
1.发送开始的时候,定义一个拥塞窗口大小为1
2.每次收到一个ACK应答,拥塞窗口加1
3.每次发送数据报的时候,将拥塞窗口和接收端主机反馈的窗口大小比较,取较小值作为实际发送的窗口
“慢启动”只是指初始时慢,但实际窗口增长是指数级的
4.当拥塞窗口超过慢启动的阈值时,不再按照指数方式增长,而是线性增长
5.TCP开始启动的时候,慢启动阈值等于窗口最大值
6.每次超时重发的时候,慢启动阈值会变成原来的一半,同时拥塞窗口置回1
延迟应答(效率机制):如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小
窗口越大,网络吞吐量就越大,传输效率就越高,我们需要在保证网络不拥塞的情况下尽量提高传输效率;
并不是所有的包都可以延迟应答,每隔N个包就应答一次,或者超过最大延迟时间就应答一次(N一般取2,超过时间取200ms);
捎带应答(效率机制):客户端和服务器在应用层也是“一发一收”的,服务器在回复客户端发送的消息时,可以将ACK捎带上。
TCP小结
3. 相关问题
3. TCP断开链接时客户端收到服务器发来的结束报文段进入TIME_WAIT,发出LAST_ACK,为什么TIME_WAIT的时间是2MSL?
4. 服务器上出现大量的CLOSE_WAIT?
服务器上出现大量的CLOSE_WAIT状态,原因就是服务器没有正确关闭socket,导致四次挥手没有正确完成,只需要加上对应的close即可解决问题。
5. 通过滑动窗口机制传输的时候,如果出现了丢包,如何进行重传?