一、计算机网络分层
- 物理层:该层包括物理联网媒介,该层的协议产生并产生电压以便发送接收携带的数据信号(网卡)
- 数据链路层:网络层和物理层之间的通信,从网络层接收到的数据被分割成待定的可被物理层运输的帧(交换机)
- 网络层:负责为分组交换网络上的不同主机提供通信服务,在发送数据时,网络层把运输层产生的报文段或用户数据封装成分组和包进行传送
- 运输层:为两台主机进程的直接通信提供通用的数据传输服务,传输协议同时进行流量控制或是基于接收方可能收数据的快慢程度规定适当的发送速率
- 会话层:负责建立两点之间维持的通信
- 表示层:应用程序和网络之间的翻译官
- 应用层:应用程序
网络协议
数据链路层:VPN
网络接口层:Wi-fi、ATM
网络层:IP、ICMP、ARP、IGMP
传输层:TCP、UDP
应用层:FTP、TeInet、SMTP、HTTP
ARP:由IP地址到MAC地址
RARP:由MAC地址到IP地址
工作在各个网络层的仪器
物理层:中继器和集线器
数据链路层:交换机
网络层:路由器(分组转发)
状态码
200(OK),400(请求报文存在语法错误)、401(未经许可,需要通过HTTP认证)404(URL地址有误)
301 Moved Permanently:永久性重定向,表示请求的资源被分配了新的URL,之后应使用更改的URL;
302 Found:临时性重定向,表示请求的资源被分配了新的URL,希望本次访问使用新的URL;
301与302的区别:前者是永久移动,后者是临时移动(之后可能还会更改URL)
303 See Other:表示请求的资源被分配了新的URL,应使用GET方法定向获取请求的资源;
302与303的区别:后者明确表示客户端应当采用GET方式获取资源
503:Server Unavailable:服务器当前不能处理客户端得请求,一段时间后,可能恢复正常。
TCP三次握手
PS:在TCP协议中,主动发起的一端成为客户端,被动连接的一端成为服务端。不管是客户端还是服务端,TCP建立连接之后都可以主动发送和接收数据
起初,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。
服务器创建完TCB后遍进入LISTEN状态,此时准备接收客户端发来的连接请求。
第一次握手
客户端向服务器端发送连接请求报文段。该报文段头部中SYN=1,ack=0,seq=x,请求发送过后客户端便进入SYN-SENT状态
ps1:SYN=1,ack=0 表示该报文段为连接请求报文段
ps2:x为本次TCP通信的字节流的初始序号,TCP规定SYN=1的报文段不能有数据部分,但要消耗掉一个序号
第二次握手
服务端接收到连接请求后,如果同意连接就会发送一个SYN=1,ACK=1,seq=y,ack=x+1,该应答完成后就会进入SYN-RCVD状态
ps1:SYN=1,ACK=1表示该报文段为连接同意
ps2:seq=y,表示服务端作为发送者是,发送字节流的初始编号
ps3:ack=x+1 表示服务端希望下一个数据发送序号是从x+1的字节
第三次握手
当客户端接收到连接同意应答后,还需要向服务端发送一个确认报文段,表示服务端发来的已经收到。
该报文段的头部为 Ack=1,seq=x+1,ack=y+1
客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!
为什么需要三次连接而不是两次连接
防止失效的连接的报文段呗服务器端接收
ps:失效的连接是指,客户端向服务器端发送的连接请求丢失,客户端等待应答超时,就会再次发送请求,此时这个请求就是失效的。
若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。
TCP四次挥手
TCP连接的释放一共需要四步,因此称为『四次挥手』。
我们知道,TCP连接是双向的,因此在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。
第一次挥手
若A认为数据发送完成,则它需要向B发送连接释放请求。该请求只有报文头,头中携带的主要参数为:
FIN=1,seq=u。此时,A将进入FIN-WAIT-1状态。
PS1:FIN=1表示该报文段是一个连接释放请求。
PS2:seq=u,u-1是A向B发送的最后一个字节的序号。
第二次挥手
B收到连接释放请求后,会通知相应的应用程序,告诉它A向B这个方向的连接已经释放。此时B进入CLOSE-WAIT状态,并向A发送连接释放的应答,其报文头包含:
ACK=1,seq=v,ack=u+1。
PS1:ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答。
PS2:seq=v,v-1是B向A发送的最后一个字节的序号。
PS3:ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。
A收到该应答,进入FIN-WAIT-2状态,等待B发送连接释放请求。
第二次挥手完成后,A到B方向的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A方向的连接仍然存在,B可以继续向A发送数据。
第三次挥手
当B向A发完所有数据后,向A发送连接释放请求,请求头:FIN=1,ACK=1,seq=w,ack=u+1。B便进入LAST-ACK状态。
第四次挥手
A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进入CLOSED状态,撤销TCB。
为什么A要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态?
为了保证B能收到A的确认应答。
若A发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,B等待超时后就会重新发送连接释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭。
TCP与UDP的区别
1、TCP面向连接,UDP面向无连接,传输之前不需要建立连接
2、TCP传输是一对一的,UDP是支持一对一、一对多、多对多、多对一(广播啥的)
3、TCP提供可靠的数据连接,UDP无法保证
4、TCP面向字节流(stream结尾),UDP面向报文
5、TCP传输慢
6、TCP首部开销大一些20字节,UDP8字节
7、TCP主要用于可靠的通信传输,比如电话,UDP用于广播
TCP与UDP对用的常见的协议
Http和Https的区别
HTTP |
HTTPS |
|
端口 |
80 |
443 |
资源 |
需要加密开销大,收费 |
|
开销 |
需要数字证书 |
|
协议 |
超文本协议,明文传输 |
Ssl加密传输协议,更安全 |
Bio:同步阻塞。 然后就开始等,一直等到奶茶做好了再去看电影,做不好就一直等;BIO、NIO、AIO
当你想去买个奶茶,然后看电影的时候,奶茶店没材料了,需要等候
Nio:同步非阻塞。然后就我不等了,我先看会电影,但是呢你看一会就回来问问奶茶好了么?
Aio:异步非阻塞。然后我就不等了,看电影去了,你奶茶好了你给我送过来。
BIO在socket中ServerSocket,来一个连接就开启一个请求;
NIO就是基于Reactor,有流可读或可写时就通知引用程序处理
AIO就是AsynchronousSocketChannel(客户端异步读写),充分调用os。