一.get 和 post 的区别

  1. 传送方式:get通过地址栏传送 post通过报文传送
  2. 传递长度:get参数有长度限制,post无限制
  3. get产生一个tcp数据包,post产生两个tcp数据包(因为get浏览器会把http header和data一并发出,服务器响应200;post浏览器先发送header,服务器响应100,浏览器再发送data,响应200)所以,get比post更有效
  4. url可见性:get参数url可见;post参数url不可见
  5. 缓存性:get请求可以缓存,post请求不可以缓存
  6. 后退页面反应:get请求页面后退,不产生影响;post会重新提交请求
  7. 安全性:post比get安全,因为传输参数url不可见

二.tcp 和 udp 的区别
tcp和udp都是传输层协议
1.可靠性:tcp可靠 udp不可靠
2.连接性:tcp面向连接,udp面向无连接
3.报文:tcp面向字节流,udp面向报文
4.tcp效率低,udp高
5.拥塞控制:tcp慢开始,拥塞避免,快重传,快恢复;udp无
6.传输速度:tcp慢,udp快
7.应用场景:tcp对准确率要求高比如电子邮件(SMTP),万维网(HTTP)文件传输(FTP)
udp对准确率要求低的场景,比如域名转换(DNS),远程文件服务器(NFS)
8.流量控制:tcp滑动窗口,udp无
9.双工性:tcp全双工,udp一对一一对多多对一多对多

三.浏览器输入url的过程
https://blog.csdn.net/wlk2064819994/article/details/79756669

  1. 输入地址:浏览器其实就已经在智能的匹配可能得 url 了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的 url,然后给出智能提示,让你可以补全url地址。对于 google的chrome 的浏览器,他甚至会直接从缓存中把网页展示出来,就是说,你还没有按下 enter,页面就出来了。
  2. 浏览器查找域名的 IP 地址:
    @---请求一旦发起,浏览器首先要做的事情就是解析这个域名,一般来说,浏览器会首先查看本地硬盘的 hosts 文件,看看其中有没有和这个域名对应的规则,如果有的话就直接使用 hosts 文件里面的 ip 地址。
    @如果在本地的 hosts 文件没有能够找到对应的 ip 地址,浏览器会发出一个 DNS请求到本地DNS服务器 。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。
    @---查询你输入的网址的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果,此过程是递归的方式进行查询。如果没有,本地DNS服务器还要向DNS根服务器进行查询。
    @---根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。这种过程是迭代的过程。
    @---本地DNS服务器继续向域服务器发出请求,在这个例子中,请求的对象是.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址。
    @---最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。
    3、浏览器向 web 服务器发送一个 HTTP 请求
    4、服务器的永久重定向响应
    5、浏览器跟踪重定向地址
    6、服务器处理请求
    7、服务器返回一个 HTTP 响应
    8、浏览器显示 HTML

四.为什么是三次握手,四次挥手?他们的过程分别是什么?
1)TCP三次握手
第一次握手:客户端A将标志位SYN置为1,随机产生一个值为seq=J(J的取值范围为=1234567)的数据包到服务器,客户端A进入SYN_SENT状态,等待服务端B确认;
第二次握手:服务端B收到数据包后由标志位SYN=1知道客户端A请求建立连接,服务端B将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端A以确认连接请求,服务端B进入SYN_RCVD状态。
第三次握手:客户端A收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务端B,服务端B检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端A和服务端B进入ESTABLISHED状态,完成三次握手,随后客户端A与服务端B之间可以开始传输数据了。
2)三次握手的意义
目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”
若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是『失效的』。
若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。
3)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状态,完成四次挥手。
4)四次挥手的原因:
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
等待2msl的原因:
http://dy.163.com/v2/article/detail/EENRSF0705315U6Q.html