面试题(一)网络

  • 简述TCP协议
    1)Transmission Control Protocol,传输控制协议。它是传输层的通信协议,有面向连接、可靠、字节流传输的特点
1.面向连接
TCP是基于连接进行数据交互,通信双方在进行数据交互之前需要建立连接,该连接也只能用在双方之间进行交互。这点不像UDP中的组播和广播,可以在同一组中多个主机交互数据。这也是导致TCP协议的复杂性的因素之一,建立连接涉及到三次握手和四次挥手的过程。

2.可靠性保证
分段机制。TCP将需要传输的数据分成合适的报文段,然后逐个传输
定时器的超时和重传机制。TCP对每个发送的报文段都设置一个定时器等待目标端返回确认收到的响应,如果未收到,则超时重传
确认报文机制。接受方收到报文后会返回确认报文告诉发送方收到报文
校验和机制。TCP保持首部和数据的校验和,接收方将校验段的校验和,如果错误将丢弃不确认等待发送方超时重传
有序机制。TCP将对报文段进行排序,保证报文段有序性
去重机制。TCP将对报文段进行去重
流控机制。由于接收方和发送的TCP缓冲区容量不一致和处理速度,需要对发送方的流量进行控制,防止网络阻塞
TCP双方进行数据交互时,数据形式为8bit组成的字节流,TCP也不在这些字节流中做任何特殊标识。

3.字节流
这种字节流的特点表现如下:
TCP不关注数据的具体内容是二进制还是ASCII字符
发送方发送的字节流和接收方接受的字节流整体表现一致,但是发送的次数和每次的大小与接受方接收的次数和大小并没有关系。

2)TCP三次握手:
客户端发送SYN(SEQ=X)报文到服务端,进入SYN_SEND状态
服务端发送SYN(SEQ=Y)+ACK(SEQ=X+1)到客户端,进入SYN_RECIV状态
客户端发送ACK(SEQ=Y+1)到服务端,开始建立连接
在这里插入图片描述
3)为什么要三次握手:
假设当前场景为二次握手即可建立连接,客户端发送第一个连接请求到服务端,中间由于网络问题导致请求延迟到达服务器,当服务端收到客户端的第一个请求时回复了ACK给客户端并建立请求,而此时客户端因为在一定时间内没有收到服务端的回应而放弃该次请求。这就导致服务端一直在等客户端发送请求,造成资源浪费。三次握手可以避免这种情况。
4)四次挥手
客户端发送FIN至服务端,请求关闭连接
服务端返回ACK,ACK的值等于FIN+SEQ
服务端发送FIN至客户端,告诉客户端应用关闭
客户端返回ACK在这里插入图片描述
5)为什么要四次挥手:
确保数据能够完整传输。当被动方收到主动方的FIN报文通知时,它仅仅表示主动方没有数据再发送给被动方了。但未必被动方所有的数据都完整的发送给了主动方,所以被动方不会马上关闭SOCKET,它可能还需要发送一些数据给主动方后,再发送FIN报文给主动方,告诉主动方同意关闭连接,所以这里的ACK报文和FIN报文多数情况下都是分开发送的

  • TCP与UDP的区别
    1)TCP是面向连接的(服务端与客户端之间要传输数据必须先有连接),UDP是无连接的
    2)TCP提供可靠的服务(无差错、不重复、不丢失、按序到达),UDP提供简单的不可靠的服务
    3)UDP具有良好的时序性,效率大于TCP。适用于高速传输和实时性比较高的通讯和广播
    4)TCP对系统资源要求高,UDP对系统资源要求低
    5)UDP程序结构更简单
    6)TCP是点对点模式,UDP是一对一,一对多和多对多的交互通信
    7)TCP是流模式,UDP是数据报模式
1、TCP 
打个比方比喻TCP,你家里有个蓄水池,你可以里面倒水,蓄水池上有个龙头,你可以通过龙头将水池里的水放出来,然后用各种各样的容器装(杯子、矿泉水瓶、锅碗瓢盆)接水。 上面的例子中,往水池里倒几次水和接几次水是没有必然联系的,也就是说你可以只倒一次水,然后分10次接完。另外,水池里的水接多少就会少多少;往里面倒多少水,就会增加多少水,但是不能超过水池的容量,多出的水会溢出。 
结合TCP的概念,水池就好比接收缓存,倒水就相当于发送数据,接水就相当于读取数据。好比你通过TCP连接给另一端发送数据,你只调用了一次write,发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次write,每次10个字节,但是对方可以一次就收完。(假设数据都能到达)但是,你发送的数据量不能大于对方的接收缓存(流量控制),如果你硬是要发送过量数据,则对方的缓存满了就会把多出的数据丢弃。 这种情况是设置非阻塞I/O模型,会把内存耗尽,因为socket是存在内核中的。 2、UDP 
UDP和TCP不同,发送端调用了几次write,接收端必须用相同次数的read读完。UPD是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。也就说,如果不指定MSG_PEEK标志,每次读取操作将消耗一个报文。 3、为什么 
其实,这种不同是由TCP和UDP的特性决定的。TCP是面向连接的,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。 
而UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样的数据是没有意义的。
  • 网络7层模型是那7层?列举一些具体的应用实例
    1)物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
    2)物理层:同轴电缆、接收器、发送器
    数据链路层:网卡、网桥、交换机
    网络层:路由器、网关
    传输层:TCP协议、UDP协议
    会话层:SQL、PHP
    表示层:MP3,PNG
    应用层:telnet、html

  • 怎么测试网络是否连通
    ping

  • 访问一个网址会经历哪些流程
    1)app catch:先看下是否有缓存,如果有缓存则直接展示缓存内容
    2)DNS:如果没有缓存,去DNS服务器对域名进行解析
    3)获取IP后客户端与服务器建立TCP连接,客户端发送http请求
    4)服务端返回请求结果
    5)浏览器对服务端返回的内容进行渲染,解析css样式、js交互等展示给用户

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章