首先我们要理解数据报文结构
【以太网报文【IP报文【tcp报文【HTTP+报文】】】】
其中以太网报文称为帧:通过网络路径中的最短MTU确定最大传递大小
1 tcp封装了HTTP报文
2 tcp/ip的设计一份完整的数据报可能会被切割成多个tcp数据报
3 tcp数据报组成 报文头+报文体
tcp的三次握手四次挥手离不开tcp的可靠性和双通道的设计思想,而实现其设计思考所依赖的就是tcp协议中tcp的报文头
再来看tcp报文结构以及tcp连接关闭过程
以javasocket为例建立socket时[ISN 初始化序列号与系统时间密切相关]
下图第四行SYN会设置为1 32位序列号会初始化一个值ISN【可以简单理解一个0-2^32-1 次方值,超过最大值会返回到0】
1 SYN为1即告诉服务端我要建立连接
2 服务端处理后发给客户端SYN建立反向的通道,ACK同意正向通道连接建立【建立通道也就是SYN为1,同意该通道也就是ACK为1 】
3 客户端发出ACK 以及确认序列号确定反向连接建立
四次挥手也是tcp可靠性设计以及TCP全双工半关闭的特性【MSS此时不出现,MSS只属于SYN连接报文】
1 一端发起关闭请求 FIN设置为1
2 另一端发起Ack 此时关闭一个连接
3 另一端发起关闭请求 FIN设置为1
4 一端发起Ack 此时关闭另一个连接
同时SYN和ACK只是说明怎么要建立双向通道,如何保证可靠性?服务端拿到ISN后,会设置确认序号为ISN+1[为什么是加1,因为SYN标志占了一个;假如传输data占用10比特 ,那么确认序号就是ISN+10(打比方,实际还有其他)] 通过序列号和确认序列号来决定TCP数据的拼接,重发等!
相关含义以及概念:
1 tcp 报头的设计说明一般情况下TCP报头的大小在20个字节
2 URG:Urget pointer is valid (紧急指针字段值有效)【不常用】
SYN: 表示建立连接 FIN: 表示关闭连接 ACK: 表示响应 PSH: 表示有 DATA数据传输 RST: 表示连接重置。
3 tcp报头首部的窗口大小16位决定了最大只有2^16次方的数据也就是65535个字节可以传递;此外这只是滑动窗口且默认值一般是4096字节,还没有涉及阻塞接口 而MSS只出现在syn报文段