计算机网络
一、计算机网络体系结构
二、IP
ARP协议
ARP (Address Resolution Protocol),即地址解析协议,可以根据IP地址获取物理地址:
主机将包含目标IP地址的ARP请求广播到局域网的所有主机,并接收返回信息,以此确定目标主机的物理地址
收到返回信息后将该IP地址和物理地址存入本机ARP缓存中,下次请求时可以直接查询ARP缓存
三、TCP
面向连接的、可靠的、基于字节流的传输层通信协议
将应用层的数据流分割成报文段并发送给目标节点的TCP层
数据包有序号,对方收到则发送ACK确认,未收到则重传
使用校验和来检验数据在传输过程中是否有误
使用超时重传机制来实现可靠传输,如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段
1. 三次握手
首次握手隐患
SYN Flood:服务端收到客户端的SYN,回复SYN-ACK的时候未收到ACK确认,服务端会不断重试直到超时(Linux默认等待63秒才断开连接)
措施:SYN队列满后,服务端通过
tcp_syncookies
参数回发SYN Cookie,若为正常连接则客户端会回发SYN Cookie直到建立连接
三次握手原因
为了初始化双方的序列号
如何保持连接
服务端向客户端发送保活探测报文,如果未收到响应则继续发送
尝试次数达到保活探测数仍未收到响应则中断连接
2. 四次挥手
四次挥手原因
TCP是全双工通信,发送发和接收方都需要发送和接受FIN报文、ACK报文
TIME_WAIT状态
确保有足够的时间让对方收到ACK包
避免新旧连接混淆
CLOSE_WAIT状态
服务器出现大量CLOSE_WAIT状态原因:对方关闭socket,我方忙于读或写,没有及时关闭连接
措施:检查释放资源的代码、检查处理请求的线程配置
3. 流量控制
流量控制是为了控制发送方发送速率,保证接收方来得及接收
接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率
4. 拥塞控制
慢开始与拥塞避免
快重传与快恢复
5. 粘包
发送方产生粘包
当发送的数据包过小时,TCP协议默认会启用Nagle算法,将这些较小的数据包进行合并发送。
接收方产生粘包
数据包会暂存在接收方的接收缓冲区中,当接收数据的速度大于应用层取数据的速度时,前一个数据包还没有来得及读取,下一个数据包又被放入了缓冲区,这时读取数据就会读取到粘连在一起的数据包。
解决方法
消息定长:发送端将每个数据包封装为固定长度的包,接收端每次接收缓冲区中读取固定长度的数据。
设置消息边界:服务端从网络流中按消息边界分离出消息内容,例如在包尾增加回车换行符进行分割。
将消息分为消息头和消息体,消息头中包含表示消息总长度的字段。
四、UDP
不维护连接状态,支持一对多、多对多通信
尽最大努力交付,不保证可靠传输
面向报文,不对应用程序提交的报文信息进行拆分和合并
数据包报头只有8个字节,额外开销小,吞吐量只受限于数据生成速率、传输速率及机器性能
1. UDP与TCP区别
无连接 / 面向连接
不可靠 / 可靠
无序 / 有序
速度快 / 速度慢
五、HTTP
1. 请求和响应的流程
客户端与服务器建立TCP连接
客户端发送HTTP请求
服务端接收请求并返回HTTP响应
客户端释放TCP连接
客户端浏览器解析HTML内容
2. 状态码
状态码 | 类型 | 含义 |
1xx | 指示信息 | 接收的请求正在处理 |
2xx | 成功 | 请求正常处理完毕 |
3xx | 重定向 | 需要进行附加操作以完成请求 |
4xx | 客户端错误 | 请求有语法错误或无法实现 |
5xx | 服务器错误 | 服务器处理请求出错 |
3. 连接管理
短连接 每进行一次 HTTP 通信就要新建一个TCP连接。HTTP/1.1 之前默认是短连接,开启长连接需要在header中设置
Connection : Keep-Alive
长连接 建立一次 TCP 连接可以进行多次 HTTP 通信。HTTP/1.1 开始默认是长连接,要断开连接需要由客户端或者服务器端提出断开,使用
Connection : close
流水线 可以在同一条长连接上连续发出HTTP请求,而不用等待响应返回。HTTP/1.1 开始支持流水线。
4. GET和POST的区别
GET只能将请求信息放在URL中,POST可以将请求信息放在请求体中
GET符合幂等性和安全性,POST不符合
GET可以被缓存,POST不可以
5. Cookie和Session的区别
Cookie是由服务器发送给客户端的特殊信息,以文本的形式存放在客户端
客户端再次请求的时候,会把Cookie回发
服务器收到后,会解析Cookie生成与客户端对应的内容
Session是服务端的机制,在服务器上保存信息
解析客户端请求并操作session id,按需保存状态信息
6. 跨域
浏览器不能执行其他网站来源的脚本,这是由浏览器的同源策略造成的,同源是指协议、域名、端口均相同。
可以使用以下方法解决:
JSONP (JSON with Padding) 创建
<script>
标签,利用<script>
标签的src
属性可以获取任何域下的script
只支持GET请求,不支持POST请求CORS 在服务器增加如下响应头的一种或几种:
代理 同源策略是针对浏览器端进行的限制,可以通过服务器端来解决。 例如客户端浏览器A需要请求另一个域B,可以让服务器作为代理,去请求域B,然后将响应结果返回给客户端A。
六、HTTPS
1. HTTP和HTTPS的区别
HTTP使用明文传输,HTTPS需要到CA申请证书,使用密文传输,更加安全
HTTP默认使用80端口,HTTPS使用443端口
2. HTTPS的加密过程
七、Socket
Socket是对TCP/IP协议的抽象,是操作系统对外开放的接口,可以实现不同主机之间的进程的双向通信。
1. Socket通信流程
2. Socket编程
编写一个网络应用程序,包含客户端和服务端,用TCP和UDP两种方式实现:
客户端向服务端发送一个字符串
服务端接收到该字符串后将其输出到命令行,然后向客户端返回字符串的长度
客户端在命令行输出服务端返回的长度
TCP实现
UDP实现
八、WebSocket
WebSocket是一个可以实现客户端与服务器全双工通信的应用层协议。客户端可以主动向服务器发送信息,服务器也可以主动向客户端推送信息。客户端与服务端通过HTTP进行握手,建立连接后,双方使用TCP推送数据。
最后更新于