计算机网络笔记

112 阅读7分钟

一些直接背的

OSI七层模型

应用层:负责给应用程序提供一个统一的接口

表示层:负责把数据转换成兼容另一个系统能识别的格式

会话层:负责建立、管理和终止表示层实体之间的通信会话

传输层:负责端到端的数据传输

网络层:负责数据的路由、转发、分片

数据链路层:负责数据的封帧和差错检测,以及Mac寻址

物理层:负责在物理网络中传输数据帧

TCP三次握手

服务端主机B到客户端主机A Server到Client Client先发出一个握手的包(syn=1,序列号=x) 此时C端状态是SYN_SENT

Server确认并回一个SYN+ACK包(syn=1,ack number=x+1, ack = 1 ,序列号=y) 此时S端状态是SYN_RCVD

Client收到S端发来的消息。如果ack number = x+1,将ack number 设置为 y+1,ack =1,然后给S端发送ACK数据包。 此时S端和C端都是EASTABLED状态。

简单来讲:C端请求S端,S端同意,C端上手再连

为什么?

比如C端发送一个SYN请求给S端,但是由于网络延迟,然后C端又发送了一个SYN请求,并且成功建立了连接。但是这个时候第一次连接请求报文已经到达了S端,如果没有三次握手的话,S端就又建立了一个连接(但其实这个时候C端是不会通过这个连接发送数据的,所以这个连接只能一直白白浪费资源)。如果采用了三次握手,S端收到一个过时的报文后向C端发送确认,C端不确认,这个时候就不会建立连接。

四次挥手

刚开始Server端和Client端都处于连接状态。假设这个时候客户端发起关闭请求了:

  1. Client端发送一个fin报文,报文当中会有一个序列号。客户端处于FIN_WAIT1状态
  2. Server端收到fin报文之后,发送一个ack报文,把客户端的序列号+1 作为ack报文的序列号。此时服务端处于CLOSE_WAIT状态。
  3. Server端准备断开连接了,发送一个FIN报文,且指定一个序列号。此时服务端处于LAST_ACK状态。
  4. Client收到FIN之后,发送一个ACK报文作为应答,且把Server端的序列号值+1作为自己ACK报文的序列号值,此时Client端处于TIME_WAIT状态。过一阵子之后,Client端确保Server收到ack报文之后才会进入CLOSE状态。(这里一般是最大报文段生存时间)。
  5. 而Server端收到ACK报文之后,就处于关闭连接了。

为什么?

等待?四次? WAIT那一步的状态。要确保Server端收到ACK报文,如果Server端没有收到ACK的话,Server端会重新发送一个FIN给Client端,客户端此时就知道ACK报文丢失了,就重新发送一次。所以为了保证这个报文段被收到,Client端是不会立马关闭的,他会在收到FIN的时候发送一个ACK等一段时间,等Server端关闭了,他才关闭。

TCP与UDP

TCP:

TCP是面向连接的,也就是说双方传数据的时候必须经历一个通道(比如三次握手)  
TCP只能有两个端点,也就是点对点传输
TCP传输可靠,传输的数据无差错、不丢失、不重复、按顺序到达
TCP提供全双工通信。允许双方的进程在任何时候都可以发送数据,因为两端都没有接受缓存
TCP面向字节流。比如发送方交给了10个数据块,但受访的TCP只用了4个数据块就收到了。但是他们的字节流是完全一样的。

UDP:

 UDP是无连接的传输层协议。
 UDP尽最大努力交付,但不保证可靠性交付。
 UDP是面向报文的,对应用层交下来的报文,不合并不拆分,保留原报文边界。
 UDP没有拥塞控制,所以网络出现拥塞也不会降低发送速率。
 UDP支撑一对一,一对多,多对多的交互通信。
 UDP的首部开销小,只有8字节。

区别:

1. TCP可靠,UDP不可靠。
2. TCP面向连接,UDP无连接。
3. TCP传输有序,UDP无序。
4. TCP不保留数据边界,UDP保留。
5. TCP传输速率比UDP慢。
6. TCP有流量控制和拥塞机制。
7. TCP是重量级协议,而UDP是轻量级协议。
8. TCP首部20字节,UDP首部8字节。

所以,TCP适合那些可靠的常用协议,虽然效率并不会很高,但一定准确,比如HTTP,HTTPS,FTP,SMTP。用处一般在于文件传输,邮件发送等。

而UDP效率高,但不一定准确,比如qq聊天,在线视频,广播或者网络语音。

HTTP几个版本

HTTP1.0

HTTP/1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接。

HTTP1.1

相比较于HTTP/1.0来说,最主要的改进就是引入了持久连接。所谓的持久连接即TCP连接默认不关闭,可以被多个请求复用。客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。HTTP/1.1版还引入了管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求。

HTTP2

HTTP/2 采用了多路复用。即在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。能这样做有一个前提,就是HTTP/2进行了二进制分帧,即 HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码。

比如说给了A和B两个任务,先处理A,结果发现处理过程非常耗时,就先把一部分处理完的发送过去(存到缓冲池),然后处理B,B处理完之后再处理A。A处理完之后,两部分响应组合在一起返回。这就得益于分帧。

POST与GET的区别

  1. GET是用来获取资源的,而POST用于传输实体主体。
  2. GET的请求参数是以查询字符串的方式出现在URL当中,而POST的参数储存在实体主体当中。
  3. GET方法是安全的,因为他只读(类似HEAD,OPTIONS);而POST有可能涉及服务器的数据库存储,状态也就发生了变化。所以就不安全。(类比PUT,DELETE)

一些HTTP的请求码

1xx 表示是协议的中间状态,还需要后续请求
2xx 表示请求成功
3xx 表示重定向,需要重新请求
4xx 表示请求报文错误
5xx 表示服务端错误

例如:

101 切换请求协议,例如HTTP切换到websoket
200 一般是请求成功
301 永久重定向:会缓存
302 临时重定向:不会缓存
304 协商缓存命中
403 服务器禁止访问
404 资源未找到
500 服务端错误
503 服务器繁忙

sql注入

SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

比如登录界面:\

用户名: ‘or 1 = 1 --
密 码:

这样在后端就是这样:

String sql =select * from user_table where username=’ “+userName+” ’ and password=’ “+password+” ‘”;

那么1=1必定成功,并且后面那个--相当于注释掉了。

HTTPS与HTTP的区别

HTTP协议运行在TCP的基础上,而HTTPS是加了一个ssh,运行与ssl上,而ssl运行与TCP上。

  1. 端口不同 HTTP的端口使用的是80,后者是443;
  2. 由于加密减秘处理,HTTPS会消耗更多的资源;

对称加密与非对称加密

对称加密就是很常见的账户密码那种模式,或者说加密解密都用同一个密钥,这样有一定风险。

而非对称加密是使用公钥和私钥,发送信息用公钥加密,然后获取信息用自己的私钥解密。
举个例子,A与B两个人,都有公钥和私钥。A想发送给B 消息,A用B的公钥加密,这样B用自己的私钥解密,就不会泄露,因为只有B自己有自己的私钥。