三次握手和四次挥手
- 三次握手
(1)客户端向服务器发送报文请求建立连接
(2)服务器接受报文并向客户端发送确认报文,表示自己已收到客户端发送的请求连接报文
(3)客户端收到服务器的确认报文,向服务器发送确认报文(确认自己已收到服务器发来的确认报文),连接建立 - 四次挥手
(1)客户端向服务器发送报文请求断开连接
(2)服务器接受报文并向客户端发送确认报文,表示自己已收到客户端发送的请求断开报文
(3)服务器向客户端发送报文请求断开连接
(4)客户端接受报文并向服务器发送确认报文,表示自己已收到服务器发送的请求断开报文,连接断开
或: - 三次握手:第一次握手:客户端像服务端发送一个SYN包,客户端进入SYN_SENT状态,等待服务端确认;第二次握手:服务端收到SYN后,给客户端返回一个SYN+ACK包,表示已收到SYN,并进入SYN_RECEIVE状态;第三次握手:客户端向服务端发送一个ACK包表示确认,双方进入establish状态,连接已建立。
为什么是三次握手?
因为如果只有两次,在服务端收到SYN后,向客户端返回一个ASK就进入establis状态,如果请求中遇到网络问题而没有传给客户端,客户端一直是等待状态,后面服务端发送的信息也接收不了了。 - 四次挥手:客户端向服务端发送一个FIN包,进入FIN_WAIT1状态;服务端收到后,向客户端发送ACK包确认,进入CLOSE_WAIT状态,客户端接收到ACK包后进入FIN_WAIT2状态;服务端再把剩余没传完的数据发送给客户端,发送完毕后再发送一个FIN+ACK包,进入LAST_ACK(最后确认)状态;客户端收到后,再向服务器发送ACK包,再等待两个周期后关闭连接。
为什么等待两个周期?
因为最后服务端发送的ACK包可能丢失,如果不等待两个周期的话,服务端在没收到ACK包之前,会不停的重复发送FIN包而不关闭。
为什么是四次握手?
服务端在收到客户端的FIN报文后,可能还有一些数据要传输,所以不能马上关闭,但是会做出应答,返回ACK报文段,再发送完数据后,再向客户端发送FIN报文,表示数据已经发送完毕,请求关闭连接。
http状态码
- 2 开头的表示成功 一般是200
- 3 开头的表示重定向
301永久重定向
302临时重定向
304可以在缓存中取数据 - 4 开头表示客户端错误
403跨域
404请求资源不存在 - 5 开头表示服务端错误 常见500
http1.0、http1.1、http2有什么区别
- http0.9只能进行get请求
- http1.0增加了post、head、option、put、delete等
- http1.1增加了长连接keep-alive,增加了host域,并且节约宽带
- http2多路复用,头部压缩,服务器推送
http和https有什么区别?https的实现原理
- http无状态连接,而且是明文传输,不安全
- https传输内容加密,身份验证,保证数据完整性
- https原理:
7层模型的概念
OSI中的上面4层(应用层、表示层、会话层、传输层)为高层,定义了程序的功能;下面3层(网络层、数据链路层、物理层)为低层,主要是处理面向网络的端到端数据流。
- 应用层:应用层是最靠近用户的OSI层,这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP等
- 表示层:数据的表示、安全、压缩,可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。格式有:JPEG、ASCll、DECOIC、加密格式等。
- 会话层:建立、管理、终止会话,对应主机进程,指本地主机与远程主机正在进行的会话。
- 传输层:定义传输数据的协议和端口号,以及流控和差错校验。协议有:TCP UDP等,数据包一旦离开网卡即进入网络传输层。
- 网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP等。
- 数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。(由底层网络定义协议)。将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。数据链路层协议的代表包括:SDLC、HDLC、PPP、STP、帧中继等。
- 物理层:建立、维护、断开物理连接。(由底层网络定义协议)。主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
TCP与UDP协议区别以及和TCP/IP的联系
- TCP/IP:TCP/IP协议是一个协议族,包括TCP、IP、UDP、HTTP、FTTP等,之所以命名为TCP/IP协议,是因为TCP和IP协议是两个很重要的协议。
TCP/IP协议集包括应用层,传输层,网络层,网络访问层 - TCP和UDP的区别
(1)TCP面向连接,UDP是无连接的,即发送数据之前不需要建立连接
(2)TCP提供可靠的服务,保证数据正确性、数据顺序,UDP有可能丢包,并且不保证数据顺序性
(3)每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
(4)TCP对系统资源要求较多,UDP对系统资源要求较少
webSocket
- 特点:服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。
- 其他特点包括
(1)建立在TCP协议之上,服务器端的实现比较容易
(2)数据格式比较轻量,性能开销小,通信高效
(3)可以发送文本,也可以发送二进制数据
(4)没有同源限制,客户端可以与任意服务器通信
(5)协议标识是ws(如果加密,使用wss) - 使用
var ws = new WebSocket("wss://echo.websocket.org");
ws.onopen = function(evt) {
console.log("Connection open ...");
ws.send("Hello WebSockets!");
};
ws.onmessage = function(evt) {
console.log( "Received Message: " + evt.data);
ws.close();
};
ws.onclose = function(evt) {
console.log("Connection closed.");
};
- webSocket.onopen:实例对象的onopen属性,用于指定连接成功后的回调函数。
如果要指定多个回调函数,可以使用addEventListener方法。
ws.addEventListener('open', function (event) {
ws.send('Hello Server!');
});
- webSocket.onclose:实例对象的onclose属性,用于指定连接关闭后的回调函数。
- webSocket.onmessage:实例对象的onmessage属性,用于指定收到服务器数据后的回调函数。
- webSocket.send():实例对象的send()方法用于向服务器发送数据。
- webSocket.onerror:实例对象的onerror属性,用于指定报错时的回调函数。