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三次握手四次挥手
简单形容的话,建立连接时的三次握手:
- 客户端 —> 服务器,客户端请求连接
- 服务器 —> 客户端,服务器确认连接信息
- 客户端 —> 服务器,客户端确认连接信息,开始连接
断开连接时的四次握手:
- A —> B,A请求断开连接
- B —> A,B确认请求并准备断开连接
- B —> A,B关闭连接并通知A
- 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版本不支持