OSI七层模型
TCP/IP模型
二者之间的关系:
三次握手/四次挥手
通信的时候不再需要SYN标识位了, 只有在请求连接的时候需要SYN标识位.
传输数据的时候的随机序号seq就是最近一次对方发送给自己的ACK的随机序号值, 而发给对方的ACK就是上次刚刚发给对方的ACK的值.
TCP数据报的格式:
上图中ACK序号对应下图中32位确认序号,其中SYN对应32位序号。
完整过程如图:
Seq和SYN对应上图中 32位序号 ACK对应32位确认序号
图中发送的ACK确认包表示给对方发送数据的一个确认, 表示你发送的数据我都收到了, 同时告诉对方下次发送该序号开始的数据.
由于每次发送数据都会收到对方发来的确认包, 所以可以确认对方是否收到了, 若没有收到对方发来的确认包, 则会进行重发.
mss: 最大报文长度, 告诉对方我这边最多一次能收多少, 你不能超过这个长度.
win: 表示告诉对方我这边缓存大小最大是多少.
三次握手和四次挥手状态转换图
图中有虚线和实线:读者看实线时,请忽略虚线;如果看虚线时,忽略实线走向。否则可能有一点混乱。
了解TCP状态转换图可以帮助开发人员查找问题.
说明: 上图中粗线表示主动方, 虚线表示被动方, 细线部分表示一些特殊情况, 了解即可, 不必深入研究.
对于建立连接的过程客户端属于主动方, 服务端属于被动接受方(图的上半部分)
而对于关闭(图的下半部分), 服务端和客户端都可以先进行关闭.
处于ESTABLISHED状态的时候就可以收发数据了, 双方在通信过程当中一直处于ESTABLISHED状态, 数据传输期间没有状态的变化.
TIME_WAIT状态一定是出现在主动关闭的一方.
主动关闭的Socket端会进入TIME_WAIT状态,并且持续2MSL时间长度,MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间将在网络中消失。
使用netstat -anp可以查看连接状态
为什么会持续2MSL
-
原因之一: 让四次挥手的过程更可靠, 确保最后一个发送给对方的ACK到达;
若对方没有收到ACK应答, 对方会再次发送FIN请求关闭, 此时在2MS时间内被动关闭方仍然可以发送ACK给对方. -
原因之二: 为了保证在2MS时间内, 不能启动相同的SOCKET-PAIR.
TIME_WAIT一定是出现在主动关闭的一方, 也就是说2MS是针对主动关闭一方来说的;由于TCP有可能存在丢包重传, 丢包重传若发给了已经断开连接之后相同的socket-pair(该连接是新建的, 与原来的socket-pair完全相同, 双方使用的是相同的IP和端口), 这样会对之后的连接造成困扰, 严重可能引起程序异常.
滑动窗口
主要作用: 滑动窗口主要是进行流量控制的.
见下图:如果发送端发送的速度较快,接收端接收到数据后处理的速度较慢,而接收缓冲区的大小是固定的,就会导致接收缓冲区满而丢失数据。TCP协议通过“滑动窗口(Sliding Window)”机制解决这一问题。
详细说明参考讲义
图中win表示告诉对方我这边缓冲区大小是多少, mss表示告诉对方我这边最多一次可以接收多少数据, 你最好不要超过这个长度.
在客户端给服务端发包的时候, 不一定是非要等到服务端返回响应包, 由于客户端知道服务端的窗口大小, 所以可以持续多次发送, 当发送数据达到对方窗口大小了就不再发送, 需要等到对方进行处理, 对方处理之后可继续发送.
mss和MTU
-
MTU: 最大传输单元
MTU:通信术语最大传输单元(Maximum Transmission Unit,MTU)
是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为 单位). 最大传输单元这个参数通常与通信接口有关(网络接口卡、串 口等), 这个值如果设置为太大会导致丢包重传的时候重传的数据量较大, 图中的最大值是1500, 其实是一个经验值.
-
mss: 最大报文长度, 只是在建立连接的时候, 告诉对方我最大能够接收多少数据, 在数据通信的过程中就没有mss了.