一。网络编程基础知识汇总
网络编程基础 (网盘享学——Netty)
1.计算机网络体系结构
a.OSI七层模型
b.TCP/IP协议
c.TCP和UDP
2.识别唯一通讯地址:源IP地址 + 目标IP地址 + 协议号 + 源端口号 + 目标端口号 这五个元素识别一个通信
3.三次握手和四次挥手
4.TCP/IP中的数据包
5.TCP中通过序列号与确认应答提高可靠性
6.HTTP请求的传输过程
7.一次完成的http请求的七个过程
1.建立TCP连接(之前可能还有一个域名解析) 7.服务器关闭TCP连接
2.客户端发送请求命令 get/www.xx.com/http/1.1 6.服务器向客户端发送数据
3.客户端发送请求头信息 5 服务器返回响应头信息
4.服务服务器应答器 Http/1.1 ok
8.http协议报文结构 请求报文结构 响应报文结构
9.一些常见术语: socket 短连接 长连接
10.Linux网络IO模型 5种
阻塞I/O 非阻塞I/O I/O复用 信号驱动 异步I/O
11.原生JDK网络编程:BIO
12.原生JDK网络编程:AIO
13.原生JDK网络编程:NIO之Reactor模式
14.原生JDK网络编程——Buffer
二。报文结构
参考链接
请求报文结构:请求行 请求头 请求主体
响应报文结构:状态行 首部行 实体
三。网络分类
- 局域网 - 城域网 - 广域网 - 互联网 - 等等…
四。网络分层
五。TCP/UDP
属于传输层协议,用来通话
- 通话一般有两种通话方式:第一种是TCP,第二种是UDP。
- TCP和UDP位于同一层,都是建立在IP层的基础之上。由于两台电脑之间有不同的IP地址,因此两台电脑就可以区分开来,也就可以互相通话了。
- UDP就好比发电报,发出去就完事了,对方有没有接收到它都不管,所以UDP是不可靠的。
- TCP传送数据虽然可靠,但传送得比较慢;UDP传送数据不可靠,但是传送得快。
TCP建立连接三次握手,断开连接四次挥手。
网址参考
1. 能不能说一说 TCP 和 UDP 的区别?
a.首先概括一下基本的区别:
TCP是一个面向连接的、可靠的、基于字节流的传输层协议。(有连接)
而UDP是一个面向无连接的传输层协议 (无连接)
b.具体分析,和 UDP 相比,TCP 有三大核心特性:
面向连接:所谓的连接,指的是客户端和服务器的连接,在双方互相通信之前,TCP 需要三次握手建立连接,而 UDP 没有相应建立连接的过程。
可靠性: TCP 花了非常多的功夫保证连接的可靠,这个可靠性体现在哪些方面呢?一个是有状态,另一个是可控制。
基于字节流:UDP 的数据传输是基于数据报的,这是因为仅仅只是继承了 IP 层的特性,而 TCP 为了维护状态,将一个个 IP 包变成了字节流。
额外.TCP连接可靠性体现在哪两个方面:
有状态:TCP会精准记录哪些数据发送了,哪些数据被对方接收了,哪些没有被接收到,而且保证数据包按序到达,不允许半点差错。这是有状态
可控制:当意识到丢包了或者网络环境不佳,TCP会根据具体情况调整自己的行为,控制自己的发送速度或者重发。这是可控制
2. 说说 TCP 三次握手的过程?为什么是三次而不是两次、四次?
a.从最开始双方都处于CLOSED状态。然后服务端开始监听某个端口,进入了LISTEN状态。
b.然后客户端主动发起连接,发送 SYN , 自己变成了SYN-SENT状态。 ————>一次握手
c.服务端接收到,返回SYN和ACK(对应客户端发来的SYN),自己变成了SYN-RE ————>两次握手
d.之后客户端再发送ACK给服务端,自己变成了ESTABLISHED状态 ————>三次握手
f.服务端收到ACK之后,也变成了ESTABLISHED状态。
为什么不是两次?
根本原因: 无法确认客户端的接收能力。
分析如下:如果是两次,你现在发了 SYN 报文想握手,但是这个包滞留在了当前的网络中迟迟没有到达,
TCP以为这是丢了包,于是重传,两次握手建立好了连接。
看似没有问题,但是连接关闭后,如果这个滞留在网路中的包到达了服务端呢?
这时候由于是两次握手,服务端只要接收到然后发送相应的数据包,就默认建立连接,但是现在客户端已经断开了。
看到问题的吧,这就带来了连接资源的浪费。
为什么不是四次?
三次握手的目的是确认双方发送和接收的能力,那四次握手可以嘛?然可以,100 次都可以。
但为了解决问题,三次就足够了,再多用处就不大了。
三次握手过程中可以携带数据么?
第三次握手的时候,可以携带。
前两次握手不能携带数据。如果前两次握手能够携带数据,那么一旦有人想攻击服务器,那么他只需要在第一次握手中的SYN 报文中放大量数据,
那么服务器势必会消耗更多的时间和内存空间去处理这些数据,增大了服务器被攻击的风险。
第三次握手的时候,客户端已经处于ESTABLISHED状态,并且已经能够确认服务器的接收、发送能力正常,这个时候相对安全了,可以携带数据。
3. 说说半连接队列和 SYN Flood 攻击的关系
六。Http 状态码
1.状态码
HTTP 400 - 请求无效 HttpStatus.SC_BAD_REQUEST
HTTP 403 - 禁止访问
HTTP 404- 无法找到文件
HTTP 500 - 内部服务器发生错误:HttpStatus.SC_INTERNAL_SERVER_ERROR
import org.apache.http.HttpStatus;
HttpStatus.SC_OK
或者spring的HttpStatus.OK.value();