TCP 协议
三层基础网络模型
- A 主机
-
上层 数据包
-
网络层 数据包+ip 头(目标 ip,发送源 ip,生存时间等)
| | 物理底层 ===> 网线 |
- B 主机
- 网络层 解析 ip 头,拿到数据包
- 上层 拿到数据包
udp
ip 只负责把数据发到对应的电脑,但是电脑不知道需要一个基于 ip 的在 ip 协议之上的协议,用来和应用打交道的协议 udp 就是这样一种协议 udp:用户数据包协议 upd 协议多了一个端口号,通过端口号,把对应的数据交给对应端口的
四层基础网络模型 UDP 版本
- A 主机
-
应用层 数据包
-
传输层 数据包+udp 头(目标端口+源端口等)
-
网络层 数据包+ip 头(目标 ip,发送源 ip,生存时间等)
-
| | 物理底层 ===> 网线 |
- B 主机
- 网络层 解析 ip 头,拿到数据包+udp 头
- 传输层 解析数据,拿到 udp 头,指定端口号
- 应用层 拿到数据包
最全 7 层网络模型 (不是 http 的)
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
udp 协议优缺点
优点:udp 协议传输速度快 缺点:
- 容易丢包
- 因为分割成多个小包,所以无法组件一个完整的数据包,数据正确性有问题
- 所以 udp 只适合一些不太在意数据正确性,注重传输速度的地方,比如视频,互动游戏
tcp
基于上诉原因,引入了 tcp 协议 tcp:传输控制协议 优点:
- 提供了排序的功能
- 支持重发
- 缺点:速度没那么快
四层基础网络模型 TCP 版本
- A 主机
-
应用层 数据包
-
传输层 数据包+tcp 头(目标端口+源端口等)
-
网络层 数据包+ip 头(目标 ip,发送源 ip,生存时间等)
-
| | 物理底层 ===> 网线 |
- B 主机
- 网络层 解析 ip 头,拿到数据包+tcp 头
- 传输层 解析数据,拿到 tcp 头,指定端口号
- 应用层 拿到数据包
tcp 三次握手 四次挥手
- 握手:
- 客户端发送:我要发送信息了:搜到请回答 SYN=1 seq = k state = syn_send
- 服务端:收到请求,我这边一些正常,可以发送,收到请回复 ACK = 1 ack = k+1 SYN = 1 seq = j state = syn_rcvd
- 客户端:收到回复,准备好,要开始发送了 ACK = 1 ack = j+1 state = established
- 服务端:(动作进入连接状态)state = established
- 传输信息----- 传输过程中,服务的收到数据后都会发送一个确认消息
- 发送消息 seq = u
- 回复收到消息 ACK = 1 ack = u+1
- 挥手:
-
客户端(或服务端):数据发送完毕,我要关闭了 FIN =1 seq = k state = close_wait_1
-
服务端:收到关闭请求 ACK = 1 ack = k+1 state = close_wait
-
客户端:收到 state = close_wait_2
-
服务端:数据发完了,我完事儿了,我也关闭了 FIN = 1 ACK =1 ack = k+1 seq = w state = last_ack
-
客户端:收到 ACK=1 ack = w+1 seq = k+1 state = time_wait
-
服务都: state = closed
-
客户端: 2 MSL 后 state = closed
问题 1 为什么握手是三次 挥手却要四次 因为建立连接时,服务端可以立刻开始建立链接,也就是进入同步状态,但是关闭连接时,服务端不一定能够立刻开始进入关闭,所以需要等服务端处理完任务
问题 2 客户端为什么要等两个最大报文生存时间才关闭 这是为了保证服务端一定能接受到最后一个 ACK,如果最后一个 ACK 丢失了,服务端会不断重复发送 FIN =1,让客户端一直发最后一个 ACK 两个最大报文生存时间,就是这一个发送一个回复所需的最大时间,如果超过,客户端都没有在收到 FIN,就可推动 ACK 已经被接受,可以接受 TCP 链接
问题 3 为什么是三次握手而不是两次握手 如果客户端发送的建立信息卡住了,等很久才发给服务端,这时候服务端收到后,建立链接,但是客户端不会发新消息,这样就建立了一个空链接 如果服务端发送的建立消息卡住了,就会,导致客户端不知道服务端是否建立链接,也不会管服务端发到消息,服务端会一直发送信息,导致死锁 问题 4 如果客户端出故障怎么办 服务端存在保活定时器,最大两小时,两小时没收到,会发生十次探测报文,如果没反应,服务器就会自动关闭