网络_协议
关键词:
OSI是Open System Interconnect的缩写,意为开放式系统互联。
RTT : Round-Trip time 往返时间
RTO:Retransmission Timeout超时重传时间
MSL :
OSI 七层模型和 TCP/IP 四层模型
OSI七层模型和TCP/IP五层模型(原来应该是四层,新版教程改成五层)的映射关系,以及对应的功能和协议:
OSI七层模型 | TCP/IP五层模型 | 对应网络协议 | 功能 |
---|---|---|---|
应用层(Application) | 应用层(Application) | HTTP、TFTP, FTP, NFS, WAIS、SMTP | 文本传输、电子邮件、文件服务、虚拟终端等 |
表示层(Presentation) | Telnet, Rlogin, SNMP, Gopher | 数据格式化、代码转换、数据加密 | |
会话层(Session) | SMTP, DNS | 解除/建立与别的连接点的Connection | |
传输层(Transport) | 传输层(Transport) | TCP, UDP | 提供端对端接口 |
网络层(Network) | 网络层(Network) | IP, ICMP, ARP, RARP, AKP, UUCP | 为数据包提供路由选择 |
数据链路层(Data Link) | 数据链路层(Data Link) | FDDI, Ethernet, Arpanet, PDN, SLIP, PPP | 传输带地址的帧、提供错误检测功能 |
物理层(Physical) | 物理层(Physical) | IEEE 802.1A, IEEE 802.2到IEEE 802.11 | 以二进制数据形式在物理媒介上传输数据 |
无论哪种模型,都可以看出来,四层是指传输层,七层是指应用层。
TCP三次握手四次挥手
TCP是面向连接的,所有的连接是指双方都确认了连接的建立。
三次握手
我们来看一下三次握手的过程:
- 一开始,客户端和服务端都处于
CLOSED
状态。客户端主动打开连接,服务端被动打卡连接,结束CLOSED
状态,开始监听,进入LISTEN
状态。
一次握手
客户端会随机初始化序号(client_isn
),
- 将此序号置于 TCP 首部的「序号」字段中,
- 同时把
SYN
标志位置为1
,表示SYN
报文。
接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接。该报文不包含应用层数据,之后客户端处于 SYN-SENT
状态。
二次握手
服务端收到客户端的 SYN
报文后,首先服务端也随机初始化自己的序号(server_isn
),
- 将此序号填入 TCP 首部的「序号」字段中,
- 其次把 TCP 首部的「确认应答号」字段填入
client_isn + 1
, - 接着把
SYN
和ACK
标志位置为1
最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD
状态。
三次握手
客户端收到服务端报文后,还要向服务端回应最后一个应答报文,
- 首先该应答报文 TCP 首部
ACK
标志位置为1
, - 其次「确认应答号」字段填入
server_isn + 1
,
最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED
状态。
好了,经过三次握手的过程,客户端和服务端之间的确定连接正常,接下来进入ESTABLISHED
状态,服务端和客户端就可以快乐地通信了。
问题:为什么是三次,不是两次、四次?
两次:如果只有前两次,服务端会认为连接已经建立,如果客户端后续不在发送报文,也就是客户端不认可这个链接,相当于这个连接资源浪费了。
四次:三次就可以完成双方的确认,没有必要多进行一次。
四次挥手
一次挥手
- 客户端打算关闭连接,此时会发送一个 TCP 首部
FIN
标志位被置为1
的报文,也即FIN
报文,之后客户端进入FIN_WAIT_1
状态。
二次挥手
- 服务端收到该报文后,就向客户端发送
ACK
应答报文,接着服务端进入CLOSED_WAIT
状态。
三次挥手
- 客户端收到服务端的
ACK
应答报文后,之后进入FIN_WAIT_2
状态。等待服务端处理完数据后,也向客户端发送FIN
报文,之后服务端进入LAST_ACK
状态。
四次挥手
- 客户端收到服务端的
FIN
报文后,回一个ACK
应答报文,之后进入TIME_WAIT
状态 - 服务器收到了
ACK
应答报文后,就进入了CLOSED
状态,至此服务端已经完成连接的关闭。 - 客户端在经过
2MSL
一段时间后,自动进入CLOSED
状态,至此客户端也完成连接的关闭。
可以看到,每个方向都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手。
问题:为什么是四次,不是三次?
三次:如果是三次,需要将服务端的ACK和FIN包合成一次发送,但是服务端在收到客户端的FIN包后,需要释放资源等各种善后操作,这个会比较浪费时间,导致给客户端端的响应时间超时,从而导致客户端重发FIN包。 所以将服务端的ACK和FIN分开发送。
思考:为什么握手需要经过双方对彼此的确认, 而挥手只需要一方对另一方的确认就可以了呢?
握手需要双方对彼此的确认,是要保证连接得到双方认可(不浪费);挥手其实也是双方对彼此的确认, 只不过是分两阶段进行的。
TCP与UDP
TCP是一个面向连接的、可靠的、基于字节流的传输层协议。
UDP是一个面向无连接的传输层协议。
面向连接:指的是客户端和服务端建立连接,在双方相互通信之前,TCP需要三次握手建立连接,而UDP没有建立连接的过程。
可靠性:TCP花了很多的功夫保障连接的可靠性
- TCP有状态:TCP会进准记录哪些数据发送了,哪些数据被对方接受了,哪些没有被接受,而且保证数据包按序到达,不允许半点差错。
- TCP可空:意识到丢包了或者网络环境不佳,TCP会根据情况调整自己的行为,控制自己的发送速度或者重发。
报文中的序列号
凡是对端的确认都需要序列号,防止端发送重复的报文。这样也使得调用有顺序性。
TCP中的端口号
端口号位于传输层的TCP报文头中。端口号用两个字节表示,最大值65535
1. 熟知的端口号:0~1023
- HTTP: 80
- HTTPS: 443
- FTP: 21
- SSH: 22
- Telnet: 23
- SMTP: 25
- DNS: 53
2. 已登记的端口号:1024~49151
- MySQL: 3306
- Oracle DB: 1521
- Redis: 6379
- MongoDB: 27017
- Tomcat: 8080
3. 临时端口号:49152~65535
你的浏览器在访问网站时,操作系统会随机分配这个范围内的一个端口作为源端口。
telnet用法
1. telnet ip/domianName port :远端这个地址下的这个端口是否可以访问
2. telnet 发送http请求
输入红框里的内容, 发送http请求,就会得到http的响应
curl 命令同样可以访问网络域名
netstat
> netstat -at
> netstat -au
tcpdump
是一个命令行的网络流量分析工具,功能非常强大,一般用于抓TCP的包。
tcpdump -i any host 180.101.49.44
- tcpdump 抓包
- -i 在机器的网卡上抓包
- any 任意网卡
- 180.101.49.44 某次测试时百度的地址
参考:
1. 深入分析四层/七层网关 - Hello-Brand - 博客园
2. “三次握手,四次挥手”这么讲,保证你忘不了 - 三分恶 - 博客园