网络分层
OSI协议网络分层为七层,从上到下分别是
应用层(application layer)
表示层(presentation layer)
会话层(session layer)
传输层(transport layer)
网络层(network layer)
数据链路层(data-link layer)
物理层(physacal layer)
TCP/IP协议网络分为4层
应用层
运输层 TCP
网际层 IP
网络接口层
TCP协议三次握手和四次挥手
三次握手(建立网络连接)![三次握手示意图](https://i-blog.csdnimg.cn/blog_migrate/ef2057e91f1c477c9a7c45f80a4c0a07.png)
- 第一步,客户端向服务端发送连接请求(SYN = 1),和一个随机起始序列号(seq),例如SYN=1(这个请求是连接请求),seq=100(这个数字是随机的一个数字)。
- 第二步,服务端收到客户端请求之后,发现SYN = 1,发现这个是一个连接请求,那么将seq存起来,并生成一个随机序列号(seq)例如300,seq = 300,然后给客户端回复一段报文,发送ACK = 1(说明收到了客户端连接请求),SYN = 1(这个请求是连接请求),seq = 300, ack = 101(客户端seq + 1)。
- 第三步,收到服务端请求后,发现ACK = 1, ack = 101,说明客户端同意这次连接,于是把服务端序列号(300)存了起来,然后给客户端发送一段报文,包含ACK = 1,seq= 101(客户端前面请求序列号 + 1),因为上次请求已经用掉了随机序列号,ack = 301(说明收到了服务端的连接请求)。
简化:
1、证明客户端发送能力
2、证明服务端收发能力
3、证明客户端接收能力
四次挥手(断开网络连接)
假设客户端初始化序列号是100,服务端初始化序列号是300,TCP连接后,客户端发送报文为1000个字节的数据,服务端在客户端发送FIN之前共收到2000个字节的数据。服务端收到FIN请求之后还有50个字节数据需要发送到客户端。
- 客户端向服务端发送FIN = 1(释放连接请求),并带上seq = 1101(100 + 1 + 1000)初始化序列号+连接用掉1个,加上一共发送1000个字节数据。客户端发送FIN,只是不能发送数据,还可以接收数据
- 服务端收到客户端请求后,给客户端发送确认信息,ACK = 1,seq = 2300, ack = 1102(1101 + 1)
- 服务端发送完最后50个自己数据后,给客户端发送FIN = 1(释放连接请求),ACK = 1(确认报文),seq = 2350, ack = 1012。
- 客户端确认收到服务端断开连接请求,发送报文ACK = 1, seq = 1012, ack = 2351。并等待2MSL时间后关闭连接(因为存在丢包,会存回2次报文最大存活时间)。服务端收到后会立马断开连接。