计算机网络
http和https
- http运行在TCP之上,明文传输,客户端与服务器都无法验证对方身份(不安全)。
- https是身披SSL外壳的http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的http。
- 端口不同,http用80端口,https443端口
- 资源消耗:https要加密解密,更消耗cpu和内存
- 开销:https通信需要证书,而证书需要像认证机构购买
- https的加密机制是共享密钥加密和公开密钥加密并用的混合加密机制
- Http是应用层协议
- 是无状态的,也就是说每一次http请求之间相互独立,没有联系,服务端1不知道客户端具体状态
- 一次http请求基本流程是:在建立TCP连接后,客户端向服务端发起一次请求request,而服务端收到以后返回给客户端一个响应response,所以我们看到http请求一般分为请求和响应两个部分
- http承载与tcp之上,有时也承载与TLS和SSL之上,这个时候,就是https
- http请求由三部分:
- 请求行:请求行一般包括请求方法,url,协议版本
- 请求报头:包括普通报头,请求报头,响应报头
- host:请求资源的域名,主机号,端口号
- accept:可接受数据格式
- cookie
- accept-encoding
- 请求正文
- Http响应也是三部分:
- 状态行:由http协议1版本号,状态码,状态消息
- 响应报头
- allow:服务器支持哪些方法
- date
- set-cookie
- 报文主体
Cookie和Session
- 用于跟踪用户会话,cookie通过在客户端记录信息确认用户身份,session通过在服务端记录信息确认用户身份
cookie - 当客户端请求服务器时,服务器就用response向客户端浏览器版发一个cookie,客户端浏览器会把cookie保存起来
- 当浏览器再次请求该网站时,浏览器就把请求的网址连同cookie一起提交给服务器,服务器检查cookie,以此来辨认用户状态
- cookie的安全性:http时无状态的,不安全的,使用http协议传送cookie容易被截获,可以设置cookie的secure属性为true,浏览器只会在https和ssl协议中传输cookie
- 缺点:
- 数量和长度有限制
- 安全性问题,被拦截
- 有些状态不能保存在客户端,比如为了防止重复提交订单,需要在服务器端保存一个计数器
session
- 客户端访问浏览器的时候,服务端把客户端的信息以某种形式记录在服务器上。当再次访问的时候只需从该session中查找用户状态
- 如果说cookie机制是检查客户身上的“通行证”来确认客户身份的话,那么session机制就是通过检查服务器上的“客户明细表”来确认客户身份,session相当于在服务器上建立了一份客户档案
- session有一个超时时间,为了防止溢出,服务器会把长时间没有活跃的session从内存中删除
两者区别
- cookie存放在客户端浏览器,session存放在服务器端
- cookie不是很安全,考虑到安全的话用session
- session会在一定时间保存在服务器,考虑到减轻服务器性能,应当使用cookie
- 单个cookie保存的数据不超过4K,很多浏览器都限制一个站点最多保存20个cookie
session依赖cookie使用
- 通过cookie储存一个session_id,然后具体数据保存在session中,下次请求的时候,会把这个session-id携带上,服务器根据session-id在session库中获取用户的session数据
对称加密和非对称加密
- 对称加密:加密解密使用同一个密钥,存在的问题是密钥的发送,如何安全的把密钥发给对方。
- 非对称加密一对公私钥,公钥在网上发布。发送密文时用对方的公钥进行加密,然后接受方用私钥进行解密。
- 非对称加密比较慢,所以一般信息用对称加密,对称加密使用的密钥用非对称加密发送。
TCP的三次握手
- 1.我要和你建立连接;2.你真的要和我建立连接吗;3.我真的要和你建立连接
- 第一次:client将标志位SYN置为1,随机产生一个seq=j,然后发送给Server,Client进入SYN_SENT状态。
- 第二次:Server收到数据包后,检查标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=j+1,随机产生一个seq=k,然后SYN=1,ACK=1,ack=j+1,seq=k发送给Client
- 第三次:收到确认后,检查ack是否为j+1,ACK是否为1。都符合后把这数据包发给Server,Server检查ack是否为k+1,ACK是否为1。正确就建立连接
- seq是序号,ack是确认序号(值为上一个seq+1)
- 检查第一次的SYN,检查第二次的ACK,ack。检查第三次的ACK,ack。
- 为什么三次握手:为了防止已失效的连接请求报文又突然传递服务器。A给B的请求由于网络延时凉了,很久时候B收到了就向A发送确认连接。但A已经不想传输了就不管他。B就傻傻的等,浪费了时间资源。(如果是两次握手,服务器收到已经失效的连接请求就进入了established状态,但此时客户端早就进入了closed状态,服务端会一直等下去,浪费服务端资源)
方便记忆 - SYN建立连接,seq顺序号码,ACK确认,ack确认号码
- 第一次第二次都有请求建立连接,所以传了SYN和seq
- 第二次和第三次都有确认连接,所以传了ACK和ack来确认上一个连接
- ack是用来检查上一个seq是否正确的
SYN攻击
攻击客户端在短时间内伪造大量IP,向服务器端发送SYN请求连接,服务器就一直不断重发,这些伪造的SYN包长时间占用未连接队列,正常的SYN请求被丢弃
TCP四次挥手
- 我要和你断开;好吧断吧;我也要和你断开;好吧断吧
- 第一次:Client发送FIN=M,用来关闭Client到Server的数据传输,Client进入FIN-WAIT1状态
- 第二次:Server收到FIN,发送一个ack=M+1。此时tcp处于半关闭
- 第三次:Server发送一个FIN给Client,用来关闭Server到Client的传输
- 第四次:CLient收到FIN后,发送ack=N+1
- 为什么最后TIME_WAIT有一个2MSL才返回CLOSE状态:网络可能会有延迟,最后一个ack可能丢失,TIME_WAIT状态是用来重发可能丢失的ack报文
TCP和UDP
- tcp面向连接,必须双方建立可靠连接才会收发数据。udp不建立可靠连接,无需维护连接状态,即不可靠。
- TCP信息包头20字节,UDP8字节
- TCP面向字节流的,UDP面向报文的
- TCP只能一对一传输,UDP可以一对一,一对多,多对一,多对多。
- TCP有流量控制,拥塞控制。UDP不关注网络状况。
- TCP通过流模式传输数据。UDP通过数据报模式传输数据
- TCP保证数据的正确性,不丢包,不重复。UDP只保证最大交付,不保证可靠性。
- TCP适合网络负担不大(他需要好网),可靠性要求高的场景。UDP适合网络负担相应高,可靠性要求不高的场景。
TCP | UDP |
---|---|
可靠连接,三次握手 | 不可靠连接 |
数据准确。慢,效率低 | 不准确,快 |
应用场景:HTTP,FTP,SMTP,POP3,Telnet,SSH | qq语音,qq视频,DNS,RIP表的更新 |
全双工的可靠信道 | 不可靠信道 |
- 单工:只支持数据在一个方向的传输,例如电视,广播。
- 半双工:允许在两个方向传输,但是某一时刻只允许数据在一个方向传输,比如对讲机
- 全双工:允许数据同时在两个方向传输(两个单工的结合),比如电话。
- 全双工,半双工,单工是面向连接才有的说法
TCP十一种状态
三次握手中的状态
LISTEN
服务端状态,应用程序打开监听端口,处理来自客户端TCP端口的连接
SYN_SENT
客户端状态,客户端发送SYN标记主动建立连接,此时处于SYN_SENT
SYN_RECV
服务端状态,服务端收到SYN后会发送SYN和ack确认到客户端,此时状态为SYN_RECV,如果发现有很多SYN_RECV状态,可能是受到了SYN Flood的Dos攻击
ESTABLISHED
客户端回复正确的ack后,就建立了连接,客户端和服务端都进入ESTABLISHED状态。
四次挥手中的状态
FIN_WAIT1
客户端状态,客户端调用close(),TCP发出FIN标记主动关闭连接,然后进入FIN_WAIT1等待远程TCP连接中断或者确认
CLOSE_WAIT
服务端状态,被动关闭状态,服务器接收到FIN后,就发送ack回应客户端
FIN_WAIT2
半关闭状态,客户端接收ack确认后,进入FIN_WAIT2
LAST_ACK
服务器发送FIN关闭,然后进入LAST_WAIT
TIME_WAIT
客户端接受到服务器端发送的FIN后,就发送ACK,并进入TIME_WAIT状态,之后主动进入CLOSED状态
CLOSED
服务器端接收到客户端传过来的ack后,进入CLOSED状态。
TCP如何保证传输可靠性
- 数据包校验:目的是检测数据在传输的过程中的任何变化,若校验包出错,则丢失报文,这时TCP发送端超时后重发数据
- 对失序数据包重新排序:TCP报文段作为IP数据报来传输,IP数据报可能会失序,此时TCP对失序数据重新排序
- 丢弃重复数据
- 应答机制:当TCP收到来自TCP连接另一端的数据,他将发送一个确认
- 超时重发:TCP发出数据好,他启动一个定时器,等待目的端确认收到报文。如果不能及时收到一个确认,将重发这个报文段
- 流量控制:TCP连接每一方都有固定大小的缓冲空间,TCP接收方只允许另一端发送接收缓冲区所能接纳的数据。(这可以防止快的主机导致慢的主机缓冲区溢出)。TCP的流量控制协议是可变大小的滑动窗口协议
拥塞控制
- 拥塞控制是一个全局性的过程,流量控制指点对点通信量的控制
- 主要方法
- 慢启动,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,由小到大的逐渐增加拥塞窗口的大小
- 拥塞避免:让拥塞窗口缓慢增加,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口按线性缓慢增长
- 快重传:接收方在收到失序的报文后就立即发出重复确认,而不是等到自己发送数据的时候捎带确认
- 快恢复:当发送方连续收到三个重复确认,就执行乘法减小
DOS攻击和DDOS攻击
- DOS拒绝服务,攻击者向被攻击者发送大量虚假的IP请求,被攻击者收到请求后返回确认信息,等待攻击者确认。由于攻击者的请求是虚假的,所以服务器接收不到返回的确认信息,在一段时间服务器处于等待状态,等待超时后,攻击者再次请求。这样最终服务器资源耗尽。
- DDOS分布式拒接服务攻击:攻击者控制多个主机发起DOS攻击
- DDOS预防(无法根治,除非不使用TCP)
- 限制同时打开SYN半连接的数目
- 缩短SYN半连接的Time Out时间
- 关闭不必要的服务
Get和Post
- GET一般用来从服务器获取数据,POST用来更新服务器数据
- Get使用URL和Cookie传参,Post将数据放在request body中
- GET的数据长度有限制(RL有长度限制),而POST没有
- POST安全,因为GET的数据以明文显示在URL上
- GET只能进行URL编码,POST能进行多种编码
- GET效率高
URL编码
- 问号前边的部分叫URL,问号后面的部分叫queryString查询字符串,
- URL三部分
- 协议
- 存有该资源的主机IP地址
- 主机资源的具体地址,文件目录名
- 第一部分第二部分用://隔开,第二第三部分用/隔开
- URL编码:产生歧义的字符用URL编码,一个%加上两个十六进制(一字节)(= &都有歧义)
从输入网址到获取页面
- 浏览器查询DNS,获取域名对应的IP地址
- 获取IP地址后,浏览器向服务器请求建立连接,发起三次握手
- TCP/IP连接建立,浏览器向服务器发送HTTP请求
SQL注入
- 通过把SQL命令插入web表单中,页面请求的查询字符串中
- 比如登录页面,输入用户名的时候输入 or 1=1 – ,or后面一定为正确,–是注释
- 避免:使用正则表达式过滤传入的参数
-
应用层:FTP(文件传输),Telnet(BBS),SMTP(发邮件),HTTP(网页),POP3(收邮件),DNS
-
传输层:TCP/UDP
-
网络层:ARP,ICMP(),IP
-
qq网页访问使用的是传输层的UDP
TCP对应的常见应用层协议
- FTP:文件传输协议,21端口
- TElnet:远程登录的端口,比如BBS,23端口
- SMTP:简单邮件传送协议,25端口
- POP3:和SMTP对应,POP3用于接收邮件,110端口(只要有相应的使用POP3协议的程序 如outlook,就可以不用web登录邮箱,直接用邮件程序就能收到邮件)
- HTTP:从Web浏览器传输超文本到本地浏览器的传送协议
UDP对应应用层协议
- DNS:域名解析服务,将域名地址转换为IP地址,53端口
- SNMP:简单网络管理协议,161端口
- TFTP:简单文件传输协议,69端口
网络层的ARP协议
- 完成IP地址与物理地址的映射
- 每台主机都会在自己的ARP缓冲区建立一个ARP列表,表示IP和MAC地址的对应关系
- 当源主机需要向目标主机发送数据,会先检查自己的ARP列表是否有该IP对应的MAC地址,如果有就直接发向这个MAC地址
- 如果没有,就向本地网段发起ARP请求广播包,查询这个目的主机对应的MAC地址(广播包里包括源主机IP,源主机MAC,目标主机IP),网络中的所有主机收到ARP请求后就检查自己的IP是否和请求包里的IP一致,一致就吧源主机的两个地址更新到自己的ARP列表中,并向源主机发送响应数据包
- 然后源主机拿到响应数据包后也更新自己的ARP列表
ping和ICMP
- ping用来探测主机到主机之间时候可以通信,ping使用的是ICMP协议
- ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间收到应答,则认为可达
- ICMP是网络层协议,通过IP协议发送
IP地址分类
- A类地址:
- 1字节网络地址+3字节主机地址,网络地址最高位是0
- 范围1.0.0.0-127.255.255.255.255 (127是01111111,八个1是255)
- 子网掩码 255.0.0.0
- B类地址
- 2字节网络地址+2字节主机地址,网络地址最高位为10
- 范围128.0.0.0-191.255.255.255
- 子网掩码255.255.0.0
- C类地址
- 3字节网络地址+1字节主机地址,网络地址最高位110
- 范围192.0.0.0-223.255.255.255
- 子网掩码255.255.255.0
- D类地址
- 最高位是1110
- 范围224.0.0.0-239.255.255.255
- 127是011111111;128是10000000;
- 191是10111111;192是11000000;
- IP地址和物理地址:网络层和以上使用IP地址;数据链路层和物理层使用物理地址
常见响应短语
- 1**:请求处理中,请求已被接受正在处理
- 2**:请求成功,被成功处理
- 200 OK
- 3**:重定向,要完成请求必须进一步处理
- 301永久性转移
- 302暂时性转移
- 304已缓存
- 4**:客户端错误,请求不合法
- 400,bad Request请求有语法错误
- 403,拒绝请求
- 404,客户端访问的页面不存在
- 5**:服务器端错误,服务器不能处理合法请求
- 500,服务器内部错误