发点:运维的时候,经常会遇到连接超时的情况,为了更好的明白程序在处理请求动作开始前和结束的动作,从这里整理下网络的一些基本知识。
1、什么是OSI模型?

| No | Model Layer | Funcatation |
| 1 | 物理层 Physical, 单位为Bit | 规范有关传输媒介的特性标准,负责将信息编码成电流脉冲。 |
| 2 | 数据链路层 | 数据链路层在不可靠的物理介质上提供可靠的数据传输。该层的作用:物理地址寻址、数据的成帧、流量控制、数据的检错和重发。 该层对接收到的物理层传输过来的比特流进行分组,一组电信号构成的数据包,就叫做“帧”,被称为帧的数据报包含帧头和帧数据,其中帧头包括接收方物理地址和其他的网络信息,帧数据就是要传送的数据。 |
| 3 | 网络层 | 数据端对端的传输建立逻辑链路,并将数据链路层提供的帧数据加工为数据包,建立合适的路由分发协议和地址解析协议(ARP)。网络层还可以实现拥塞控制、网际互连等功能。 |
| 4 | 传输层 | 建立连接,提供可靠的端到端的网络数据流服务(Port端口),功能包括是否选择差错恢复协议还是无差错恢复协议,以及对收到的顺序不对的数据包进行排序, |
| 5 | 会话层 | 定义了如果开始、控制和结束一个会话,包括对多个双向消息的控制和管理,会话层管理主机之间的会话进程,及负责建立、管理、终止进程之间的会话,还会利用在数据中插入校验点来实现数据的同步。 |
| 6 | 表示层 | 这一层的主要功能是根据需要的协议对数据进行格式定义和数据加密、压缩、格式转换等。 |
| 7 | 应用层 | 应用层为模型中的最顶层,为应用程序提供服务并规定应用程序中通信相关的细节或称为网络服务的接口。 |
3、数据封包过程

| 应用层 | 发送消息 | segment |
| 表示层 | 消息类型 TEXT | packet |
| 会话层 | 建立会话 | frame |
传输层 | 报文消息头 PORT | |
| 网络层 | IP地址的报文消息头 IP | |
| 链路层 | 添加一个以太信息 MAC | |
| 物理层 | 网卡 电信号 |

字段介绍:
3)标志位:共6个,
ACK:确认序号有效
FIN:释放一个连接
PSH:接收方应该尽快将这个报文交给应用程序
RST:重置连接
SYN:发起一个新的连接
URG:紧急指针(urgent pointer)有效
1、TCP/IP模型
| 应用层 | 为应用提供网络服务,具体的信息展示 |
| 传输层 | TCP/UDP协议,PORT |
| 网络层 | IP地址 |
| 数据链路层 | MAC,多路访问控制 |
| 物理层 | 传送介质 |

说明:
客户端(Client)和服务端(Server)开始状态为CLOSED、LISTENED;
第一次握手:Client发送给Server一个SYN(synchronous)报文并指明客户端的初始化序列号为ISN@(seq,随机产生X),此时Client状态变为SYN_SENT;
Source port Destination port Sequence number=X Acknowledgment number(if ACK set) Data offset U
R
G
AC
K
P
S
H
RST
1
F I N Windows checksum Urgent point(if URG set) Any options user data Server接收到Client发送的报文后,会发送要给ACK(Acknowledgement)报文给Client,将自己的SYN作为应答,并指明自己的初始化序列号ISN(sequence)。同时把Client传来的x+1作为ack值,表示已经收到了Client的SYN报文,此时Server状态为SYN_REVD的状态。
Source port Destination port Sequence number=Y Acknowledgment number(if ACK set)=X+1 Data offset U
R
G
1
P
S
H
RST
1
F I N Windows checksum Urgent point(if URG set) Any options user data 第三次握手:Client接收到Server返回的报文,会再次发送一个ACK响应报文,一样把seq值加1作为ack值,表示已经接收到了Server的SYN报文,此时Client处于ESTABLISHED状态,Server接收到报文后,状态变更为ESTABLISHED。
Source port Destination port Sequence number Acknowledgment number(if ACK set)=Y+1 Data offset U
R
G
1
P
S
H
RST
SYN
F I N Windows checksum Urgent point(if URG set) Any options user data(X+1)
至此TCP三次握手结束,连接建立后数据开始传输。
1)client第一个SYN包丢失,没有收到Server的ACK,则Client进行持续重传SYN包,总尝试时间为75秒。
2)Server包收到了clent的SYN包,并发出SYN+ACK包,SYN+ACK包丢失。
client:因为没有收到server的ACK,将执行1);
server:超时时间内没有收到client的ACK包,将再次发送SYN+ACK包;
3)当Client接收到Server响应的SYN+ACK后,其状态变为ESTABLISHED,并发送ACK包给Server。
①若ACK包在网络中丢失,那么Server的状态依然为SYN_REVD,在等待3、6、12秒后依然会执行发送SYN、ACK包给Client,重发次数为5次。如果在5次尝试内并未建立连接,则server自动关闭该连接,如果在重发过程中收到了Client的带有数据的ACK报文,连接也能建立。
②若ACK包丢失,Server的状态经过重发后状态已经变为CLOSED,此时在接收到Client报文,Server会返回给Client一个RST报文,重置连接且重新发起connect()。

Client发起连接释放的请求,FIN=1,seq=u,发送后Client状态变为FIN_WAIT1。 Source port Destination port Sequence number=U Acknowledgment number(if ACK set) Data offset U
R
G
AC
K
P
S
H
RS
T
S
Y
N
1 Windows checksum Urgent point(if URG set) Any options user data Server接收到Client发送的FIN报文后,返回给Client ACK报文,seq=v,ack=u+1,同时状态变为CLOSED_WAIT;Client接收到ACK报文后,状态变更为FIN_WAIT2。
Source port Destination port Sequence number=V Acknowledgment number(if ACK set)=U+1 Data offset U
R
G
1
P
S
H
RST
S
Y
N
F I N Windows checksum Urgent point(if URG set) Any options user data 稍后,Server发送FINACK报文(seq=w,ack=u+1),关闭连接,同时状态变为LAST_ACK。
Source port Destination port Sequence number=W Acknowledgment number(if ACK set)=U+1 Data offset U
R
G
1
P
S
H
RST
S
Y
N
1 Windows checksum Urgent point(if URG set) Any options user data Client接收到Server第二次发来的FINACK报文,返回给Server ACK报文(seq=u+1,ack=w+1),此时状态变为TIME_WAIT。经过一段时间后(MSL),Client报文变为Closed。Server接收到Client的ACK报文后,状态变为CLOSED。
Source port Destination port Sequence number=U+1 Acknowledgment number(if ACK set)=W+1 Data offset U
R
G
1
P
S
H
RST
S
Y
N
F I N Windows checksum Urgent point(if URG set) Any options user data
至此通信结束。
3)服务器有大量的CLOSED_WAIT状态:从TCP的挥手原理出发,Server在接收Client的FIN报文后会立即返回一个ACK报文,并进入CLOSED_WAIT状态。从应用层面,在错误日志里会有socket.error信息,抛出异常后,代码没有closedsocket()操作,也会产生大量的CLOSED_WAIT状态。
1)为什么断开连接需要四次挥手?
为了保证最后的ACK报文信息能在足够的时间内送达Server,避免Server接收不到ACK报文而不断的重发FINACK报文信息,同时Server没有接收到ACK报文,而进行重传FINACK报文到Client,Client再次发送ACK报文给Server,保证Server正常的进入连接关闭状态。
2020年9月18日




