【】是没想起来的
连接?
什么是连接?
RFC793:
【用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括SOCKET、窗口大小、序列号成为连接】
- 【SOCKET:四元组,源/目的/主机号/端口号】
- 【序列号:用于解决乱序问题】
- 【窗口大小:用于流量控制】
TCP?
transmission control protocol,传输控制协议,是可靠的,面向连接的,基于字节流的传输层通信协议
- 可靠的,通过一些机制保证数据包的到达,按序,不损坏(IP是不可靠的,不可靠体现在不保证交付,不保证按序交付,不保证交付后的数据包是否完好无损)
- 面向连接的,【一对一的连接】(UDP不是面向连接的,不需要三次握手四次挥手,可以一对一一对多)
- 基于字节流的,TCP的消息是没有边界的,是基于字节流的,收到重复的报文会丢弃
TCP首部格式
- 16位源端口号
- 16为目的端口号
- 32位序列号
- 32位确认应答号
- 首部长度,TCP首部长度在没有额外选项的情况下是20字节,但是可能有额外选项,所以需要次字段
- 【URG,紧急指针生效的字段】
- ACK,除了三次握手的第一个SYN报文外其余都是1
- PSH,接收方收到报文后,不应该等待缓冲区满,而直接向上传送数据
- RST,发生错误,需要重置连接
- SYN
- FIN
- 16位窗口大小
- 16位CHECKSUM
- 16位紧急指针
- 额外选项
唯一确定一个TCP连接
四元组可以唯一确定一个连接
IP数据包头部中的源/目的IP地址(32位) + TCP数据包头部中的源/目的端口号(16位)
TCP、UDP区别
- 可靠/不可靠
- 面向连接的/不是面向连接的
- 建立释放连接的时候
- 基于字节流/基于数据包
- 头部大小
- 一对一/一对多
- 【分片不同】【TCP是在TCP层分片,UDP是交给IP分片】
三次握手
client:closed, syn_sent, establised
syn, syn/ack, ack
server:closed, listing, syn_recv, established
为什么三次握手
- 避免历史报文初始化连接产生混乱(principle purpose)
- 同步双方序列号
- 双方确认双方的收发能力正常
- 避免资源的浪费
避免历史报文初始化连接产生混乱
-
什么时候会历史syn可能初始化连接?
- 发送多个syn时,老的syn被网络延迟
- 启用某些参数跳过time_wait时,也有可能
-
为什么三次握手能避免
client在第三次握手的时候能够有足够的上下文来判断是不是历史连接,如果是可以RST报文终止,如果不是则正常开始第三次握手(第三次可以携带数据请求,前两次不行)
避免资源的浪费
如果两次握手就初始化连接的话,那么server在收到syn报文并且回复syn/ack报文的时候就会进入established的状态,这个时候延迟的syn可能再次初始化连接,也就是初始化了历史连接
同步双方序列号
序列号是实现可靠数据传输的关键,采用一发一收的形式可以确认自己和对方的序列号有没有同步
双方确认双方的收发能力正常
| 次数 | client | server |
|---|---|---|
| 1 | 什么都不知道 | client发,server收 |
| 2 | client发,client收,server发,server收 | client发,server收 |
| 3 | client发,client收,server发,server收 | client发,client收,server发,server收 |
跳过三次握手 TCP Fast Open
请求 TCP Fast Open Cooki
- 客户端发送SYN数据包,该数据包包含Fast Open选项,且该选项的Cookie为空,这表明客户端请求Fast Open Cookie;
- 支持TCP Fast Open的服务器生成Cookie,并将其置于SYN-ACK数据包中的Fast Open选项以发回客户端;
- 客户端收到SYN-ACK后,缓存Fast Open选项中的Cookie。
实施TCP Fast Open
以下描述假定客戶端在此前的TCP連接中已完成請求Fast Open Cookie的過程並存有有效的Fast Open Cookie。
- 客户端发送SYN数据包,该数据包包含数据(对于非TFO的普通TCP握手过程,SYN数据包中不包含数据)以及此前记录的Cookie;
- 支持TCP Fast Open的服务器会对收到Cookie进行校验:如果Cookie有效,服务器将在SYN-ACK数据包中对SYN和数据进行确认(Acknowledgement),服务器随后将数据递送至相应的应用程序;否则,服务器将丢弃SYN数据包中包含的数据,且其随后发出的SYN-ACK数据包将仅确认(Acknowledgement)SYN的对应序列号;
- 如果服务器接受了SYN数据包中的数据,服务器可在握手完成之前发送数据;
ISN
initial synchronize number,初始序列号
-
为什么不从0开始 / 为什么client和server的ISN不一样
- 防止黑客攻击
- 更有效防止异常情况
- 因为随机开始的序列号可能根本就不在对方的接收窗口之内,对方即使接收了也不会产生将其视为有效
-
ISN生成方式
ISN = 时钟算法 + 以源/目的/主机号/端口号为参数的哈希函数
分片方式
-
UDP是交给IP分片,TCP是在传输层分片的
-
TCP在传输层分片的好处?
- 因为TCP要实现可靠数据传输,所以重传等机制都是在传输层实现的
- 如果交给IP分片,重传的是分片前的数据包,这些数据包很大
- 如果是TCP分片,重传的是分片后的数据包,相对来说重传的数据较少
-
MSS,MTU
-
MSS,max segment size,传输层的最大长度
-
MTU,max transport unit,网络层的最大长度,以太网是1500byte
-
MSS = MTU - IP Header - TCP Header
-