1.传输层
socket—>和传输层是密切相关的
传输层负责端到端之间的传输,只关注起点和终点
起点:源ip/源端口
重点:目的ip/目的端口
ip地址是一个32位的整数,IP协议中来描述的(网络层的概念)
端口号:区分一台主机上的哪个程序,是一个16位的整数(传输层的概念)
2.UDP
UDP:很难表示一个很大的数据,长度上限是64kb
源端口:16位
目的端口:16位
UDP长度:16位
UDP检验和:16位
UDP校验和使用了一种很简单粗暴的CRC冗余校验,取每个字节,把每个字节的数据依次循环想加,得到一个最终的数字,就是校验和。
冗余:加强了可靠性,但是降低了数据的一致性
接收端按照同样的规则再次计算校验和,和发送端的校验和进行对比,如果数据一致,就可以认为数据没有发生错误。
MD5:字符串哈希算法。
UDP特点:
(1) 无连接
(2) 不可靠
(3) 面向数据报
(4) 全双工
3.TCP
TCP特点:
(1) 有连接
(2) 可靠传输
(3) 面向字节流
(4) 全双工
TCP的设计核心:(1)可靠性(发送者能知道自己发送是否成功)
(2)在保证可靠性的前提下尽量提高传输效率
可靠性:
(1)
- 确认应答:保证可靠性的核心机制
- 为了区分当前是应答哪个数据,需要引入序号和确认序号的概念
- 序号是给每个字节都编了个号
- 确认序号表示的是当前序号之前的数据已经都收到了,同时也意味着向发送端索要当前确认序号开始的数据
(2)
- 超时重传:也是可靠传输中最核心的机制
- 传输一条数据没有确认应答的时候,等待一段时间,然后进行重传,重传可能恢重复若干次,重传的次数越多,丢包的概率也很就越来越小,重传的等待时间间隔,也在依次变长
(3)
-
连接管理:三次握手建立连接,四次挥手断开连接
建立连接的意义:
1.双方各自试探对方看看对方是否适合和我建立连接,双方的读写数据的能力。
2.双方可以在建立连接过程中协商一些必要的数据(TCP的序号的基准值)
三次握手的具体过程
客户端先发起一个建立连接的请求(SYN同步报文段),服务器收到SYN之后会立刻返回一个确认报文段ACK,同时回复的这个ACK也是一个SYN,客户端收到SYN后再返回一个ACK
三次握手中,中间两次操作百分之百都是合在一起的
四次挥手中,两次操作可能合在一起,也可能不合
涉及到的重要状态:
(1)LISTEN状态,服务器端的状态,表示手机开机,信号良好,随时可以有人和你建立连接
(2)ESTABLISHED状态:表示别人给你打电话,你接通了,连接已经建立完成随时可以通信了
四次挥手断开连接
一收到FIN由内核立刻就回复,程序中调用socket对象的close方法的时候才会发送FIN
涉及到的重要状态:
(1)CLOSE_WAIT:等待程序调用close来完成最终的断开连接过程.
如果一个服务器上出现大量的CLOSE_WAIT是啥情况?
其实就是代码有bug,代码里的close忘记调了,或者没有执行到
(2)TIME_WAIT:虽然此时程序可能都已经结束了,但是还是要保持连接为TIME_WAIT状态一段时间,因为发送的最后一个ACK可能会丢包
TIME_WAIT等待时间是2MSL,MSL成为网络上两个主机之间数据传输的理论最大时间,在CentOS7 上默认是60秒
4.滑动窗口
窗口:不等待ACK的情况下批量发送多少数据
滑动:每次收到一个ACK之后,就依次发送下一条数据,等待ACK的数据区间就往后移动。
窗口越大,传输效率就越高。
如果窗口无限大,那么接受端可能处理不过来,网络环境也可能承载不了
所以要保证可靠性的前提下,窗口越大越好
- 如果在滑动窗口中丢包了咋办?
如果是ACK丢了,没事,不用管,因为确认序号表示的含义是当前序号之前的数据都收到了,后一个ACK就能涵盖前一个ACK的含义.
如果是数据丢了,接受端就反复尝试索要该丢掉的数据,重复若干次之后,发送端就回认为丢包。并重传对应的数据,而对于已经发送成功的数据,则没必要重新传输一遍(快速重传)
5.流量控制:限制滑动窗口的一种机制
根据接收端的处理能力来进行限制
接收缓冲区剩余空间越大,就认为处理能力越强
接收缓冲区剩余空间越小,就认为处理能力越弱
生产者消费者模型
一:一个交易场所
二:两种角色,生产者/消费者
三:三种关系:生产者和生产者之间的互斥关系
消费者与消费者之间的互斥关系
生产者和消费者之间的同步互斥关系
6.拥塞控制:根据网络拥堵情况,来限制发送端的发送频率
试探式的方式,刚开始的时候,使用比较小的滑动窗口,如果这个时候没有丢包,说明网络很通畅,增大滑动窗口,如果发生丢包,说明网络可能拥堵了,见效滑动窗口。
发送端真实的滑动窗口大小=min(流量控制中的窗口大小,拥塞窗口)
7.延时应答:提高传输效率的方式
尽可能的提高窗口大小
延时应答导致延时时间中,接收端的程序已经处理了一部分的数据,此时ACK中的窗口大小就更大了。
8.捎带应答:在延时应答的基础上,再提高传输效率
延时应答的基础之上,把应用程序发送的业务数据和系统发送的ACK数据合二为一
总结:(1)可靠性—>确认应答,超时重传,连接管理
(2)传输效率—>滑动窗口—>(流量控制—>延时应答—>捎带应答,拥塞控制)
9.面向字节流
10.粘包问题(面向字节流导致的问题)