1.简述 OSI 七层协议。
应用层、表示层、会话层、运输层、网络层、数据链路层、物理层
2.简述 TCP/IP 四层协议。
应用层、运输层、网际层、网络接口层
3.TCP 和 UDP 的区别是什么?
1)TCP和UDP都是传输层协议,TCP是面向连接的传输(通过三次握手保证有连接),UDP是无连接的传输。
(2)TCP是面向字节流的传输,他可以将信息分割成组,到了接收端将其重组,UDP是面向数据报的传输,没有分组开销。
(3)TCP因为有链接所以信息传输稳定可靠,无失序,无差错,无丢失,无重复,UDP传输不可靠,可能会发生失序,差错,丢失,重复等现象。
(4)TCP传输速度慢,UDP传输速度快。
(5)TCP提供拥塞控制和流量控制机制,UDP不提供拥塞控制和流量控制机制。
4.TCP 连接建立的时候 3 次握手的具体过程,以及其中的每一步是为
什么?
第一次:客户端发送请求报文SYN,seq序列号为x
第二次:服务器收到客户端请求连接的报文,返回两个报文ACK,SYN,ACK报文确认收到请求,SYN表示同意连接。
第三次:客户端向服务器返回确认报文ACK,建立连接
5.TCP 断开连接的具体过程,其中每一步是为什么那么做?
第一次:客户端发起断开连接的请求报文FIN
第二次:服务器返回确认帧ACK,表示已经收到请求,但是服务器可能还有数据美发送完,所以不会立刻断开连接。
第三次:服务器发送完全部数据后,发送FIN报文,表示数据已经全部发送完,可以断开连接进入LAST-ACK状态,等待收到客户端发送最后一个ACK报文后关闭。
第四次:客户端收到服务器发来的FIN报文,意味着已经接受全部数据,返回ACK报文并等待2MSL时间后,关闭。
6.TCP 的十一种状态?
三次握手:
CLOSED:初始状态
LISTEN:监听状态,可以接受连接
SYN-SEND:客户端发送连接请求SYN后进入此状态,等待服务端的ACK
SYN-RCVD:服务端收到请求连接的SYN包后并发送ACK,进入此状态,很短暂
ESTAB-LISHED:建立连接,两个进程可以互相通信。
四次挥手:
CLOSE-WAIT:对方主动发来中断请求或者网络异常,我方进入此状态。
FIN-WAIT-1:当socket在ESTAB-LISHED状态主动关闭连接(发送FIN包)后,进入FIN-WAIT-1状态,
FIN-WAIT-2:半连接状态,一方要求关闭连接,一方还有未发送完的数据,需要等待对方发送完数据关闭连接请求的FIN包。
TIME-WAIT:收到FIN包,并发送确认ACK包后进入此状态,等待2MSL后关闭连接。MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,每个具体的TCP实现都必须选择一个确定的MSL值.RFC 1122建议是2分钟,但BSD传统实现采用了30秒.TIME_WAIT 状态最大保持时间是2 * MSL,也就是1-4分钟。
LAST-ACK:收到FIN包并发送ACK后,传输完全部数据并发送FIN包后进入次状态,等待对方的最后一次ACK确认。到收到ACK后,进入CLOSED状态
CLOSED:
7.什么是 socket?简述基于 tcp 协议的套接字通信流程。
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
通信流程
8.简述基于 udp 协议的套接字通信流程
9. TCP 为什么不是两次握手?而是三次握手?
第一次握手后,服务端可以确认客户端发送和接受功能正常,但客户端什么都不能确认
第二次握手后,客户端可以确认自己和服务端收发功能正常,连接建立
第三次握手后,服务端可以确认自己的收发功能正常,连接建立。
如果变为两次握手,会出现问题:客户端发送的包在链路中传输超时,成为无效包,等服务端收到后,服务端依然建立连接,发送确认包。但客户端超时后会重发请求包,这样会浪费资源,可能还会产生各种问题。
10.为何基于 tcp 协议的通信比基于 udp 协议的通信更可靠?
udp发送数据包以后就视为任务完成,不会再管这个数据包了。
而tcp协议的流量控制(停止等待,回退N步,滑动窗口),拥塞控制(慢开始,快重传,快恢复)保证了每个字节的可靠性。
11.网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
多进程:适用于客户端数量不大时。
多线程:实现异步,客户端数量较大时,通常使用协程。
12.大规模连接上来,并发模型怎么设计?