Java计算机网络基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_34122324/article/details/82850822



TCP/IP 四层协议是哪四层,分别起什么作用?还有OSI七层呢?

TCP/IP 四层:应用层HTTP、传输层TCP、网络层IP、网络接口层(数据链路层)

  • 应用层HTTP:应用层是所有用户面向的应用系统的统称。 TCP/IP 协议族在这一层面有着很多协议来支持不同的应用,如我们进行万维网(www)访问用到了HTTP协议、文件传输用FTP协议、电子邮件发送用SMTP、域名的解析用DNS协议、 远程登录用Telnet协议等等,都是属于TCP/IP应用层的。
  • 传输层TCP:主要提供应用程序间的通信,TCP/IP协议族在这一层的协议有TCP和UDP
  • 网络层IP:是TCP/IP协议族中非常关键的一层,主要定义了IP地址格式,从而能够使得不同应用类型的数据在Internet上通畅地传输,IP协议就是一个网络层协议。
  • 网络接口层(数据链路层):这是TCP/IP软件的最底层,负责接收IP数据包并通过网络发送,或者从网络上接受物理帧,抽出IP数据包,交给IP层。

OSI七层



网络-三次握手与四次挥手

1.TCP报文结构主要有TCP首部与TCP数据部分。TCP首部:主要有源端口、目的端口、序号、确认号等信息。

2.在说三次握手之前,我们需要认识几个TCP的状态名称和含义。在TCP层,有个FLAGS字段,这个字段有以下几个标示:SYN(Synchronize Sequence Numbers,同步序列编号),FIN(Finish),ACK(Acknowledgment Number),PSH(Push),RST(Reset)

  • SYN标志用来建立连接。如果SYN=1而ACK=0,表明它是一个连接请求;如果SYN=1且ACK=1,则表示同意建立一个连接。
  • FIN标示关闭连接。置1时表示发端完成发送任务,用来释放连接,表明发送方已经没有数据发送了。
  • ACK标示响应。置1时表示确认号(为合法,为0的时候表示数据段不包含确认信息,确认号被忽略。)
  • PSH标示有DATA数据传输。置1时请求的数据段在接收方得到后就可直接送到应用程序,而不必等到缓冲区满时才传送。
  • RST用来复位一条连接。当RST=1时,表示出现严重错误,必须释放连接,然后再重新建立。

一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。

3.三次握手的过程如下图所示
三次握手

  • 第一次握手:客户机A发送标识位SYN = 1,随机产生序列号seq = x的数据包到服务器B。服务器B由SYN = 1知道客户机A要建立连接,并进入SYN_SEND状态,等待服务器确认;
  • 第二次握手:服务器B收到请求并确认联机信息后,向客户机A发送标识位SYN = 1,ACK = 1和随机产生的序列号seq = y,确认码ack number = x+1(客户机A发送的seq+1)的数据包,此时服务器进入SYN_RECV状态;
  • 第三次握手:客户机A收到后检查确认码ack number是否正确,即和第一次握手发送的序列号加1结果是否相等,以及ACK标识位是否为1;若正确,客户机A发送标识位ACK = 1、seq = x + 1和确认码ack number = y + 1(服务器B发送的seq+1)到服务器B,服务器B收到后确认ACK=1和seq是否正确,若正确则完成建立连接,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据.。

4.四次挥手的过程如下图所示
四次挥手
所谓的四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭。当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了。但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

  • 第一次挥手:客户端A发送一个FIN = 1、初始化序列号seq = u,到服务器B,用来主动关闭客户A到服务器B的数据传送,客户机A进入FIN-WAIT-1状态,等待服务器B发送FIN;
  • 第二次挥手:服务器B收到这个FIN,它发回ACK = 1、确认序号ack number为收到的序号加1(ack number=u+1);和SYN一样,一个FIN将占用一个序号seq = v,客户机A进入FIN-WAIT-2,稍后关闭连接,服务器B进入CLOSE_WAIT,等待关闭连接;
  • 第三次挥手:服务器B关闭与客户端A的连接,发回标识位FIN = 1,ACK = 1,seq = w和确认码ack number=u+1给客户端A,服务器B进入LAST_ACK,等待最后一次ACK确认;
  • 第四次挥手:客户端A发送ACK = 1报文确认,并将确认序号设置为收到序号加1(ack number=w+1)到服务器B,客户机A进入TIME-WAIT等待2MSL后进入CLOSE可用状态,服务器B进入CLOSE可用状态。

三次握手常见面试问题

1.为什么是三次握手?两次不行吗?

  假定出现一种异常情况:A发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,以致延误到连接释放以后才发送到B,这本来应该是一个早已失效的报文段。但是呢,B收到此失效的请求连接报文段后,就误认为是A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手的话,那么只要B发出确认,新的连接就建立了。
  由于现在A并没有发出连接请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的连接已经建立了,并且一直等待A发送数据,就会造成了B的资源浪费。
  采用三次握手的话,就可以防止上述情况发送。像在刚才的情况下,A不会向B的确认发出确认。B由于收不到确认,就知道A是没有要求建立连接的。

2.为什么建立连接时三次握手,而关闭连接却是四次挥手呢?
  因为LISTEN状态下的这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。
  但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,才能发送FIN报文,因此不能一起发送。故需要四步握手。

3.为什么TIME_WAIT状态还需要等2MSL(最大报文段生存时间)之后才能返回到CLOSE状态呢?
  虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样)。
  但是我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。


网络-在浏览器地址栏输入url之后都发生了什么?

输入url后发生事件脑图
1.DNS域名解析

  • 在浏览器DNS缓存中搜索
  • 在操作系统DNS缓存中搜索
  • 读取系统hosts文件,查找其中是否有对应的ip
  • 向本地配置的首选DNS服务器发起域名解析请求

2.简历TCP连接(三次握手)
  为了准确地传输数据,TCP协议采用了三次握手策略。发送端首先发一个SYN(synchronize)标志的数据包给接收方,接收方收到后,回传一个带有SYN/ACK(acknowledegment)标志的数据包以示传达确认信息。最后发送方再回传一个带ACK标志的数据包,代表握手结束。在这过程中若出现问题中断,TCP会再次发送相同的数据包。
  TCP是一个端到端的可靠的面向连接的协议,所以HTTP基于传输层TCP协议不用担心数据的传输的各种问题。

3.发送HTTP请求
请求方法:

  • GET:获取资源
  • POST:传输实体主题
  • HEAD:获取报文首部
  • PUT:传输文件
  • DELETE:删除文件
  • OPTIONS:询问支持的方法
  • TRACE:追踪路径

4.接受响应结果
服务器返回的状态码:

  • 1**:信息性状态码
  • 2**:成功状态码
    200:OK 请求正常处理
    204:No Content请求处理成功,但没有资源可返回
    206:Partial Content对资源的某一部分的请求
  • 3**:重定向状态码
    301:Moved Permanently 永久重定向
    302:Found 临时性重定向
    304:Not Modified 缓存中读取
  • 4**:客户端错误状态码
    400:Bad Request 请求报文中存在语法错误
    401:Unauthorized需要有通过Http认证的认证信息
    403:Forbidden访问被拒绝
    404:Not Found无法找到请求资源
  • 5**:服务器错误状态码
    500:Internal Server Error 服务器端在执行时发生错误
    503:Service Unavailable 服务器处于超负载或者正在进行停机维护

5.浏览器解析HTML
  浏览器按顺序解析html文件,构建DOM树,在解析到外部的css和js文件时,向服务器发起请求下载资源,若是下载css文件,则解析器会在下载的同时继续解析后面的html来构建DOM树,则在下载js文件和执行它时,解析器会停止对html的解析。这便出现了js阻塞问题。
  浏览器解析css,形成CSSOM树,当DOM树构建完成后,浏览器引擎通过DOM树和CSSOM树构造出渲染树。渲染树中包含可视节点的样式信息(不可见节点将不会被添加到渲染树中,如:head元素和display值为none的元素)
  这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。

6.浏览器布局渲染

  • 布局:通过计算得到每个渲染对象在可视区域中的具体位置信息(大小和位置),这是一个递归的过程。
  • 绘制:将计算好的每个像素点信息绘制在屏幕上


猜你喜欢

转载自blog.csdn.net/baidu_34122324/article/details/82850822