网络知识复习

TCP,HTTP和Socket区别

  • tcp是传输协议,http是超文本传输协议
  • tcp是传输层协议,http是应用层协议
  • http连接是基于tcp的三次握手的
  • Socket连接过程分为三个步骤:服务器监听,客户端请求,连接确认
  • Socket可以支持不同的传输层协议(TCP或UDP)
  • Socket是对TCP/IP协议的封装

网页访问过程

DNS域名解析 –> 发起TCP的三次握手 –> 建立TCP连接后发起http请求 –> 服务器响应http请求,浏览器得到html代码 –> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) –> 浏览器对页面进行渲染呈现给用户

GET和POST区别

GET

特点:

  • GET是放在浏览器地址栏上请求的,对用户可见
  • GET语义是从指定的服务器中获取数据
  • GET请求有长度限制
  • GET请求能够被缓存
  • GET请求不安全

POST

特点:

  • POST请求对用户不可见
  • POST语义是提交数据给指定的服务器处理
  • POST请求没有长度限制
  • POST请求不能被缓存
  • POST请求比GET请求安全

GET和POST的区别

区别 GET POST
点击返回/刷新按钮 没有影响 数据会重新发送(浏览器将会提示用户“数据被从新提交”)
添加书签 可以 不可以
缓存 可以 不可以
编码类型(Encoding type) application/x-www-form-urlencoded application/x-www-form-urlencoded or multipart/form-data. 请为二进制数据使用multipart编码
历史记录 没有
长度限制 没有
数据类型限制 只允许ASCII字符类型 没有限制。允许二进制数据
安全性 查询字符串会显示在地址栏的URL中,不安全,请不要使用GET请求提交敏感数据 因为数据不会显示在地址栏中,也不会缓存下来或保存在浏览记录中,所以看POST求情比GET请求安全,但也不是最安全的方式。如需要传送敏感数据,请使用加密方式传输
可见性 查询字符串显示在地址栏的URL中,可见 查询字符串不会显示在地址栏中,不可见

其他HTTP请求方式

方式 描述
HEAD 与GET请求类似,不同在与服务器只返回HTTP头部信息,没有页面内容
PUT 上传指定URL的描述
DELETE 删除指定资源
OPTIONS 返回服务器支持的HTTP方法
CONNECT 转换为透明TCP/IP隧道的连接请求

TCP三次握手四次挥手

简单形容的话,建立连接时的三次握手:

  1. 客户端 —> 服务器,客户端请求连接
  2. 服务器 —> 客户端,服务器确认连接信息
  3. 客户端 —> 服务器,客户端确认连接信息,开始连接

断开连接时的四次握手:

  1. A —> B,A请求断开连接
  2. B —> A,B确认请求并准备断开连接
  3. B —> A,B关闭连接并通知A
  4. A —> B,A确认关闭

三次握手:

第一次(syn=1,seq=x):

客户端向服务器发送syn=1,seq=client_isn的数据包,客户端进入SYN_SEND状态

第二次(syn=1,ack=1,seq=y,ack_num=x+1):

服务器收到请求包之后,syn=1,ack=1,seq=server_isn,ack_num=client_isn+1的数据包,服务器进人SYN_RCVD状态

第三次(ack=1,ack_num=y+1):

客户端接收到回复后,检查收到的ack_num是否是之前发出去的seq+1以及ack是否为1,如果都对,就再发送syn=0,ack=1,ack_num=server_isn+1,发送后客户端进入ESTABLISHED状态,服务器收到后进入ESTABLISHED状态

client_isn和server_isn是 随机ISN 序列号

ack和syn是标志位

四次挥手:

第一次挥手(fin=1,seq=x):

假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。发送完毕后,客户端进入 FIN_WAIT_1 状态

第二次挥手(ack=1,ack_num=x+1):

服务器端确认客户端的 FIN包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。

第三次挥手(fin=1,seq=y):

服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN置为1。

发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。

第四次挥手(ack=1,ack_num=y+1):

客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK包。

服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED状态。

三次握手四次握手原因

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

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

速学路径:

http://www.jianshu.com/p/092705233d37

滑动窗口

滑动窗口是接受数据端使用的窗口大小,用来告知发送端接收端的缓存大小,以此可以控制发送端发送数据的大小,从而达到流量控制的目的。

拥塞窗口

那么对于数据的发送端就是拥塞窗口了,拥塞窗口不代表缓存,拥塞窗口指某一源端数据流在一个RTT内可以最多发送的数据包数

TCP与UDP的区别

  • TCP是面向连接的,UDP是无连接的
  • TCP有顺序控制重发控制,还有流控制(流量控制),拥塞控制,UDP不保证消息送达
  • TCP通过3次“握手”来保证数据发送的安全性,不会丢失数据包
  • UDP每一次发送数据都需要绑定IP和端口号。相当于发送邮件,只管是否发送成功,不保证对方是否接收到数据
  • TCP连接是点对点的,UDP支持多对多通信
  • UDP适用于实时性比较高的,比如视频,广播,TCP适合传输文件

HTML状态码

​ (1)
​ 常见错误代码:200,304,400,404,500

​ (2)
​ 1xx:临时响应,服务器端响应成功,
​ 等待请求者进一步操作

​ (3)
​ 2xx:响应成功

​ 202接受请求,未处理

​ 204处理了请求,但没有返回任何内容

​ (4)
​ 3xx重定向,要完成响应,服务器需要进一步处理

​ 301网页已被永久移动到新位置

​ 302临时移动到新位置

​ 305要求只能使用代理才能访问

​ (5)
​ 4xx请求错误

​ 400不理解请求语法

​ 401要求身份验证,先登陆才能请求

​ 403禁止访问,服务器拒绝请求

​ 405请求中的方法被禁用

​ 408请求超时

​ (6)
​ 5xx服务器在处理请求时内部发生错误,来自服务器本身的错误

​ 501服务器不具备完成该请求的功能

​ 502服务器作为网关或代理,从上游服务器收到无效响应

​ 504网关超时

​ 505 HTTP版本不支持