1.网络的七层模型
应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
五层模型
应用层 传输层 网络层 数据链路层 物理层
2.TCP 和 UDP的区别
TCP:面向连接、一对一通信、提供可靠交付、全双工通信、面向字节流
UDP:无连接、n对n通信、不提供可靠交付、没有拥塞控制、面向报文
3.A跟B之间有100个TCP连接,是如何去唯一标识其中一个连接
TCP链接是一对IP:端口号之间的链接,所以每个链接的socket套接字是不完全一样的
4.TIME_WAIT发生的情况以及做了什么?
调用close()发起主动关闭的一方,在发送最后一个ACK之后会进入time_wait的状态,也就说该发送方会保持2MSL时间之后才会回到初始状态。MSL(max segment lifetime)值得是数据包在网络中的最大生存时间。产生这种结果使得这个TCP连接在2MSL连接等待期间,定义这个连接的四元组(客户端IP地址和端口,服务端IP地址和端口号)不能被使用。
5.TIME_WAIT的作用
1)等待该链接中所有的报文失效
2)防止服务器端没有收到最后的ACK报文,然后再重传FIN报文,客户端需要应答并重传ACK
6.TIME_WAIT此时端口不能用要怎么办
服务器可以设置端口复用选项SO_REUSEADDR套接字选项来通知内核,如果端口忙,但TCP连接位于TIME_WAIT状态时可以重用端口。在一个非常有用的场景就是,如果你的服务器程序停止后想立即重启,而新的套接字依旧希望使用同一端口,此时SO_REUSEADDR选项就可以避免TIME_WAIT状态。
如果出现大量的TIME_WAIT状态,可以通过更改配置,缩短TIME_WAIT的时间,让服务器能够快速回收和重用那些TIME_WAIT的资源
7.知道close_wait状态吗?如果客户端出现大量的该状态,说明什么?怎么解决?
被动关闭的一端会出现close_wait状态,一般出现在server端,若客户端出现大量的该状态,说明是服务器主动断开连接,客户端的连接没有被处理
查代码,说明客户端没有在服务器端断开连接后进行处理,没有主动发送FIN报文正常关闭链接
8.TCP如何保证可靠性
1)数据按字节编序号
2)数据有校验和
3)数据被切割为合适的长度进行发送
4)未按序到达的数据,会排序后再交给上层应用程序
5)重复到达的数据会清除
6)消息确认机制:接收端收到消息会进行确认,发送端对于未收到确认的消息继续缓存,超时重新发送
7)以滑动窗口作流量控制,防止发送端发送过快
9.为什么连接的时候是三次握手,关闭的时候却是四次挥手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
TCP连接的全双工的,可以单向关闭,客户端关闭连接时,服务器仍然可以发送数据。
10.TCP 为什么要3次握手啊 4次握手怎么样啊?
增加服务器受到攻击的难度
考虑两次握手和四次握手的可行性和必要性
两次握手:
1)服务器端回复SYN报文时,客户端没有收到,但是服务器以为连接建立成功,会维护这个连接并发送数据,造成资源浪费;
2)超时的客户端SYN请求导致服务器建立连接
四次握手:
没有必要