计算机网络基础知识
计算机网络基础知识
TCP/IP 四层结构
ps: 上图中是图解HTTP中的划分
应用层
决定了向用户提供应用服务时通信的活动
传输层
提供处于网络连接中的两台计算机直接的数据传输
网络层 或 网际层
处理网络上流动的数据包
网络接口层 对应 OSI 中的 链路层+物理层
处理连接网络的硬件部分
应用层
HTTP协议
- HTTP请求报文格式
- HTTP响应报文格式
GET请求与POST请求的区别?
- GET请求参数出现在url中,POST请求数据写入报文主体
- GET请求封装在一个TCP报文中发出,POST 被浏览器拆分,先发首部,再发数据
- GET请求时幂等的,POST不是
传输层
TCP
- TCP 连接的建立
三次握手过程(三握手报文)及目的
目的:建立可靠的通信信道,简单地说,就是通信双方都确认自己与对方的接收与发送都是正常的。
序号 | 方向 | 动作 | 效果 |
---|---|---|---|
1 | Client -> Sever | 发送带有SYN标志的数据包 | Server确定自己接收正常;对方发送正常 |
2 | Server -> Client | 发送带有SYN和ACK标志的数据包 | Client确定自己发送正常,接收正常;对方发送正常 |
3 | Client -> Server | 发送带有ACK标志的数据包 | Server确认自己发送正常,接收正常;对方发送正常,接收正常 |
为什么要进行3次握手?
- 防止之前的请求建立连接报文滞留网络中,当报文到达Server端是2,对报文确认,此时会打开2条连接。第三次握手的存在可以使客户端忽略服务端对滞留报文的确认。
- 通过3次握手,双方才能初始化通信时的序号seq和ack,即ISN(Intial Sequence Number)和 MSS
- 通过次握手,通信双方才能知道自己和对方 发送和接收功能都正常
Question:有没有其它握手方案?
- 可以将第二次握手 Server -> Client 发送SYN,ACK 报文拆分成两次 一次发送 SYN 一次发送ACK
- 三次握手已经是最佳方案,握手次数不能比3少,可以比3多,但握手次数多消耗资源也更多
- TCP 连接的释放
四次挥手
对可靠的通信信道进行关闭
序号 | 方向 | 动作 | 效果 |
---|---|---|---|
1 | Client -> Server | 发送带有FIN的数据包 | Client提出关闭请求,进入只接收不发送状态 |
2 | Server -> Client | 发送带有ACK的数据包 | Server回应收到关闭请求 |
3 | Server -> Client | 发送带有FIN的数据包 | Server提出关闭请求 |
4 | Client -> Server | 发送带有ACK的数据包 | Client发送最后一个ACK 通道关闭 |
为什么要进行四次挥手?
- TCP连接是全双工的,双方都要主动关闭连接和确认对方关闭
- 如果两边同时断开连接,就会进入CLOSING状态,然后到达TIME_WAIT状态,双方都会浪费2MSL时间
- ps: RFC793 3.5节中提到,如果Server收到FIN后没有数据要发送了,那么就回复一个FIN,ACK 四次握手就变成了3次,(多次出现[ F.]、[F.]、[.]三个序列,即3次挥手)
TIME-WAIT 为何等待2MSL?
ps: MSL 为最长报文寿命
- 保证最后一个ACK被服务端收到,没收到可以再发送,并重置2MSL定时器
- 保证本地端口号在2MSL时间内不会被再次使用,避免新连接中出现旧连接的请求报文
如何避免TIME_WAIT
- 调整Linux内核参数
- 修改/etc/sysctl.conf 设置 net.ipv4.tcp_tw_reuse = 1 复用TIME_WAIT状态下的socket
- net.ipv4.tcp_tw_recycle = 1 加速TIME_WAIT状态下的socket回收
- 设置Nginx等服务器
- 设置keepalive 属性 让服务器不要主动关闭连接,除非连接超时
- 使用RST报文来关闭连接
- RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的。就像上面说的一样,发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓存区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。
- 设置socket属性:SO_REUSEADDR
- 这个套接字选项通知内核,如果端口忙,但TCP状态位于 TIME_WAIT ,可以重用 端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息, 指明"地址已经使用中"。如果你的服务程序停止后想立即重启,而新套接字依旧 使用同一端口,此时 SO_REUSEADDR 选项非常有用。必须意识到,此时任何非期 望数据到达,都可能导致服务程序反应混乱,不过这只是一种可能,事实上很不 可能。
CLOSE-WAIT 存在意义?
通知上层应用,通道即将关闭,尽快把剩余的数据发出,上层应用将剩余数据发送完成后,确认关闭后,Server才发出 FIN 报文
TCP提供可靠传输服务的原因
- 可靠传输的工作原理
1.停止等待协议
每发送完一个分组就停下来,等待对方的确认,收到确认后再发送下一个分组
2.连续ARQ协议
发送方每收到一个确认就把发送窗口向前移动一个分组的位置
- 可靠传输的实现
1.滑动窗口协议
2.超时重传机制