说说TCP的三次握手

“握手”是为了建立连接, TCP三次握手的流程图如下: 
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

第一次握手:建立连接时,客户端发送SYN包[syn=j)到服务器,并进入SYNSEND状态,等待服务器确认;

第二次握手:服务器收到SYN 包,必须确认客户的SYN (ack=j+1) ,同时自己也发送一个SYN包(syn=k) ,即SYN+ACK包,此时服务器进入SYN RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK[ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

 

TCP Flags
➢URG :紧急指针标志
➢ACK :确认序号标志
➢PSH : push标志
➢RST :重置连接标志
➢SYN :同步序号,用于建立连接过程
➢FIN : finish标志,用于释放连接

 

谈谈TCP的四次挥手


“挥手”是为了终止连接, TCP四次挥手的流程图如下:
TCP采用四次挥手来释放连接

第一次挥手: Client发送-一个FIN,用来关闭Client到Server的数据传送,Client 进入FIN WAIT 1状态;

第二次挥手: Server 收到FIN后,发送一个ACK给Client,确认序号为收到序号+1 (与SYN相同,一个FIN占用一个序号),Server 进入CLOSE WAIT状态;

第三次挥手:Server发送-一个FIN, 用来关闭Server到Client的数据传送,Server 进入LAST ACK状态;

第四次挥手: Client 收到FIN后,Client 进 入TIME WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

 

 

1.为什么会有TIME_ WAIT状态


原因,
➢确保有足够的时间让对方收到ACK包
➢避免新旧连接混淆
-----------------------------------------------------------------------------------

2.为什么需要四次握手才能断开连接
因为全双工,发送方和接收方都需要FIN报文和ACK报文
-----------------------------------------------------------------------------------


3.服务器出现大量CLOSE_ WAIT状态的原因
对方关闭socket连接,我方忙于读或写,没有及时关闭连接
➢检查代码,特别是释放资源的代码
➢检查配置,特别是处理请求的线程配置

-----------------------------------------------------------------------------------

4.GET POST区别

  • 在客户端, Get 方式在通过 URL 提交数据,数据 在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。

  • GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

  • 安全性问题。使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用
    get ;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post 为好。

  • 安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。换句话说, GET 请求一般不应产生副作用。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。 POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解)。

-----------------------------------------------------------------------------------

5.TCP UDP区别 (*)

  • TCP是面向连接的,UDP是无连接的;

  • TCP是可靠的,UDP是不可靠的;

  • TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多的通信模式;

  • TCP是面向字节流的,UDP是面向报文的;

  • TCP有拥塞控制机制;UDP没有拥塞控制,适合媒体通信;

  • TCP首部开销(20个字节)比UDP的首部开销(8个字节)要大;

-----------------------------------------------------------------------------------

6从输入网址到获得页面的过程

  • (1). 浏览器查询DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等。对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;
  • (2). 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;
  • (3). TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;
  • (4). 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
  • (5). 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;
  • (6). 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。

 

-----------------------------------------------------------------------------------

7.为什么是三次握手不是两次握手

  • 在只有两次“握手”的情形下,假设Client想跟Server建立连接,但是却因为中途连接请求的数据报丢失了,故Client端不得不重新发送一遍;这个时候Server端仅收到一个连接请求,因此可以正常的建立连接。但是,有时候Client端重新发送请求不是因为数据报丢失了,而是有可能数据传输过程因为网络并发量很大在某结点被阻塞了,这种情形下Server端将先后收到2次请求,并持续等待两个Client请求向他发送数据...问题就在这里,Cient端实际上只有一次请求,而Server端却有2个响应,极端的情况可能由于Client端多次重新发送请求数据而导致Server端最后建立了N多个响应在等待,因而造成极大的资源浪费

-----------------------------------------------------------------------------------

8.为什么是四次挥手

  • 双向通信

  • 假如现在你是客户端你想断开跟Server的所有连接该怎么做?第一步,你自己先停止向Server端发送数据,并等待Server的回复。但事情还没有完,虽然你自身不往Server发送数据了,但是因为你们之前已经建立好平等的连接了,所以此时他也有主动权向你发送数据;故Server端还得终止主动向你发送数据,并等待你的确认