Web编程

网络七层协议

应用层 HTTP FTP SMTP TelNet
表示层 JPEG
会话层 RPC SQL
传输层 TCP UDP
网络层 IP 路由器
数据链路层 交换机
物理层 光缆

TCP四层协议

应用层 HTTP FTP SMTP TelNet JPEG RPC SQL
传输层 TCP UDP
网际互联层 IP 路由器
网络接口层 交换机 光缆

TCP为什么合并应用层

因为应用层 表示层 会话层一般都在一个应用服务中一起实现,不大好区分,所以干脆就合并到一起

TCP三次握手四次挥手

  • 三次握手
    客户端发送 SYN seq=x 进入SYN-SEND状态
    服务端接收之后发送 SYN ACK ack=x+1 seq=y 进入SYN-RECV状态
    客户端接收之后发送 ACK ack=y+1 seq=x+1 进入LISENTED状态
    服务端接收之后进入LISENTED状态
  • 四次挥手
    客户端发送 FIN seq=u 进入FIN-WAIT状态
    服务端接收之后发送 ACK ack=u+1 seq=v 进入CLOSE-WAIT状态
    客户端接收之后进入FIN-WAIT2状态
    服务端处理完连接关闭之后发送 FIN ACK seq=w ack=u+1 进入LAST-ACK状态
    客户端接收之后发送 ACK ack=w+1 seq=u+1 进入TIME-WAIT状态
    服务端接收之后关闭连接
    客户端等待两个传输周期后关闭连接

TCP如何保证可靠

  • 数据分块 数据被分割成tcp认为合理的数据块
  • 序列号和确认应答 每一个包都有各自的编号和对上一次接收的确认,每次发送都需要接收方ack
  • 校验和 校验部首和数据部分
  • 流量控制 接收方和发送方都有一个缓冲区,当接收方缓冲区快满,会提示发送方慢一点,防止丢包,滑动窗口控制
  • 拥塞控制 当网络拥堵时减少数据发送,一开始不知道网络是否拥堵,就发少量数据,一点一点增大
  • 超时重传 定时器,如果没有收到响应就再发
  • ARQ停止等待协议 发送一段就停止,等待响应

TCP最大连接数

操作系统使用socket封装tcp,socket本质上是一个CIP+C端口与SIP+S端口的映射关系
发送方 跟端口数量有关 最多65535;接收方就可以接受IP数量*65535个链接了

如果接收方滑动窗口满了,发送方会怎么做

接收方返回给发送方的ACK包中,会返回当前接收方缓冲区的窗口大小,发送方会通过坚持计时器周期性的询问接收方

CLOSS-WAIT 和 TIME-WAIT

服务器在接受到客户端发起的关闭链接请求之后,响应客户端,然后进入CLOSE-WAIT状态,因为服务器缓存区可能还有东西没有发送完,要等到数据发送完之后才能关闭连接
客户端在接收到服务端确认关闭连接后进入TIME-WAIT状态,防止还有数据发送过来,如果快速关闭,再吃创建连接有可能复用到刚才的端口接收到上一个连接的数据

TIME-WAIT状态有什么问题

高并发下,占用文件描述符,使新连接无法释放;修改配置或设置 SO_REUSEADDR 套接字,使得服务器处于 TIME-WAIT 状态下的端口能够快速回收和重用。

TIME-WAIT为什么是2MSL

客户端发送最后ACK之后,为了确认服务端接收到了,启动一个2MSL的定时器,如果2MSL没有接收到服务端的FIN保温,说明服务端已经close连接,完成了第四次挥手

TCP流量控制和拥塞控制

  • 流量控制 接收方和发送方都有一个缓冲区,当接收方缓冲区快满,会提示发送方慢一点,防止丢包,滑动窗口控制,ACK包中返回窗口大小
  • 拥塞控制 当网络拥堵时减少数据发送,一开始不知道网络是否拥堵,就发少量数据,一点一点增大;一旦报文失序,快速响应,连续失序恢复慢开始门限一半

慢开始、拥塞避免、快重传、快恢复

UDP和TCP的区别

TCP是面向连接的,UDP不是面向连接的
TCP实现可靠传输,UDP不可靠
TCP发送的是字节流,UDP发送的是数据报文
TCP传输慢,UDP快
TCP需要资源多,UDP少
TCP首部20~60,UDP8字节

UDP为什么是不可靠的

UDP只有一个socket接收缓存区,没有发送缓冲区,所以有数据就发,不管对方是否接收到,对方接收缓冲区满了,就会丢弃新消息,也没有流量控制和重传机制,所以不可靠

HTTP协议

超文本传输协议 通用头+请求头+响应头+实体

什么是长链接

长链接是为了规避多次请求同一个服务每次都要进行三次握手和四次挥手,客户端通过通用头中的Connection: keep-alive 告诉服务端,这个链接我要维持一会儿
Http1.1默认长链接

长短链接使用场景

长:操作频繁,点对点通讯,即时通讯,网络游戏
端:用户数量较多,电商网站,因为长链接会占用大量资源

HTTP有哪些Method

1.0 GET, POST 和 HEAD
1.1 OPTIONS, PUT, PATCH, DELETE, TRACE CONNECT GET, POST HEAD

GET和POST区别

get参数放在url之后,参数会出现在地址栏,不安全;post是放在请求实体中
get编码只支持URL编码
get只支持ASCII 字符格式的参数
get提交数据长度有限制,一般由浏览器控制,chrome8182、火狐65535、IE2000

HTTP1.0 HTTP1.1 HTTP2 HTTP3

  • 1.1比1.0 增加了多种缓存策略;range头允许客户端请求部分数据;增加24中状态码:414地址太长 410资源删除;host头支持虚拟主机;默认长链接
  • 2.0比1.x 二进制传输,数据分成数据流,有ID表示唯一;多路复用,使用流ID判断是来自哪个http的;压缩头部,传输头部表示,从头部信息表找到对应头部(双方都会维护);服务器推送
  • 3.0 是在 QUIC 基础上发展起来的,其底层使用 UDP 进行数据传输

HTTPS

以安全为目标的 HTTP 协议,在 HTTP 的基础上通过传输加密和身份认证的方式保证了传输过程的安全性

  1. 客户端发起https请求,链接服务端433接口,发送本身支持的算法类型和秘钥长度
  2. 服务端接到消息,从自身支持的算法中选择一个发送给客户端
  3. 服务端发送包含数字证书的报文,证书内容、公钥
  4. 服务端发送一个完成报文给客户端,第一阶段协商完成。
  5. 客户端发送一个由公钥加密过的报文,包含一个随机密码串pre_master_secre
  6. 客户端发送finish 等待服务端解密后的回执
  7. 服务端解密之后发送finish给客户端,自己可以正确解密
  8. 之后进入TCP握手阶段,报文都以pre_master_secre进行对称加密传输

HTTP和HTTPS区别

端口,http80 https443
内容 http明文 https密文
https 除了握手还要有ssl协商

对称加密和非对称加密

对称加密指同一个秘钥进行加密解密
非对称加密指一个密钥对,私钥加密数据可以用公钥解密,

RSA

RSA是一个非常经典的非对称加密算法
原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥;
素数选择的越大,越安全,但是素数越大,加密和解密耗时也越长;
所以在一般场景,RSA用于传递对称加密的秘钥

什么是Restful

select poll epoll

操作系统提供的NIO方式,IO多路复用,同步不阻塞IO
select()方法会返回已经准备好的数据流,有1000个的限制
poll()比select(),没有限制
epoll()是基于信号通知的机制,首先创建一个epoll文件描述符,想epoll描述符中添加监听事件,比如某socket的read()操作,然后调用epoll_wait()方法,等待通知

水平触发,只要有就发 边缘触发,只要改变就发 epoll默认是水平

转发与重定向

转发一般指servlet之间的请求传递,会携带request和response内容,地址栏无变化
重定向只通过response返回一个302状态码+location地址头,浏览器获取之后,再次发起访问,两次请求,独立req和resp,地址栏变化

servlet

servlet是java对web开发指定的web服务器功能组件。
servlet可以处理动态资源的请求,扩展web服务器的功能。

tomcat原理

tomcat是一个servlet容器,同时也是一个http服务器

tomcat架构

server 一个tomcat实例
service 一个server至少包含一个service
Connector 用于处理连接相关的事情,并提供Socket与Request和Response相关的转化;一个service可以有多个;http https

Endpoint处理socket;Processor封装request;Adapter将reqeust交给container
Container 用于封装和管理Servlet,以及具体处理Request请求;一个service只有一个
Engine引擎,管理多个站点;
Host 代表一个站点;
Context 代表一个应用,一个war包就是一个context;一个host下可以有多个context
Wrapper 是一个servlet的包装,一个context包含多个

tomcat请求执行流程

tomcat在Container是通过责任链模式调用的

tomcat中最大可以有多少链接

connector上可以配置maxConnections和acceptCount
tomcat的最大连接数参数是maxConnections,这个值表示最多可以有多少个socket连接到tomcat上。
maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200
acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100
BIO模式下默认最大连接数是它的最大线程数(缺省是200),NIO模式下默认是10000,APR模式则是8192(windows上则是低于或等于maxConnections的1024的倍数)。如果设置为-1则表示不限制。

tomcat使用的是什么链接框架

NIO:非阻塞 I/O,采用 Java NIO 类库实现。
NIO2:异步 I/O,采用 JDK 7 最新的 NIO2 类库实现。
APR:采用 Apache 可移植运行库实现,是 C/C++ 编写的本地库。

单点登录

单点登录指,在分布式系统中的会话跟踪,以前我们使用session保存在服务器上,在分布式中需要解决session共享分问题,一种是使用另外的存储介质统一存储session,一种是使用token

cookie和session

cookie是一种客户端状态管理技术,支持服务器将一些信息埋到浏览器对应的域名之下,浏览器在访问此域名的资源时会自动携带,在response中通过set-cookie的header
cookie随意复制,伪装成用户
session是一种服务端状态管理技术,有web服务器创建,并保存在web服务器上,将sessionId通过set-cookie写入浏览器cookie

会话跟踪技术

http请求是无状态的,很多情况需要确认http发起方的身份,又不能总让用户传递用户名和密码,所以需要会话跟踪技术

JWT

token是一种客户端状态管理技术,用户验证身份后,服务端发给客户端一个token,客户端保存次token,每次请求的时候将token写入header 的Authorization=
'Bearer' + token,服务端拿到请求的token,进行解析,只是本地解析,不进行记录
json web token,是一种基于json的token,分为三部分 header(声明加密算法)、playload(有效信息用户身份)、signature(签名)

XSS攻击

跨站脚本注入攻击,向正常网站的表单中注入恶意脚本代码,窃取网站私有内容,比如窃取cookies、localstorage、sessionstorage的内容。或是注入一些代码,指令等。
设置cookies为HttpOnly 使cookie不可被js读取操作。
使用XSSFilter过滤此类请求参数。

CSRF攻击

跨站请求伪造,诱导用户在恶意网站内点击链接,链接请求正常网站的功能业务,会自动携带正常网站的cookies,在用户不知情的情况下完成一些操作。

  1. 健强服务端逻辑,严格restful风格,可以防御一些低端的攻击。
  2. 利用请求头中的refer内容,refer是浏览器在发起请求是设置的当前请求来源网站的信息,可以防御绝大部分的攻击。
  3. 每次请求需要用户填写验证码,可以防御所有攻击,当然这种方式体验太差。
  4. x-xsrf-token,在发起请求前由前端从cookie中读取一个随机token,这个token可能是之前种下的,写到header中,因为只有同一个域下的js才能访问cookie(未设置httponly的),可以防御所有攻击。

跨域请求

浏览器对网站的一种保护,非原网站发起的请求,需要跨域资源共享,才被允许访问
1.jsonp
2.服务端允许跨域Access-Control-Allow-Origin 、Access-Control-Allow-Credentials:true

Request中attr和param的区别

param为请求传入的参数,attr是主动设置的参数
param不可以修改,attr可以修改可以删除
param只能是string,attr可以是对象

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容

  • 谈论WEB编程的时候常说天天在写CGI,那么CGI是什么呢?可能很多时候并不会去深究这些基础概念,再比如除了CGI...
    __七把刀__阅读 2,176评论 2 11
  • 之前这个系列的文章一直在讲用Go语言怎么编写HTTP服务器来提供服务,如何给服务器配置路由来匹配请求到对应的处理程...
    KevinYan_a990阅读 472评论 0 1
  • Python Web编程概念梳理 主要讲解三个关键字 服务器 WSGI 框架 前言 学编程有两种方式,一种是自上而...
    _kkk阅读 497评论 0 2
  • 套接字地址结构 ipv4套接字地址结构 POSIX定义如下: sin_len字段,是由处理来自不同协议族的套接字地...
    FengyunSky阅读 562评论 0 1
  • 之前简单的通过TCP/IP模型介绍了网络编程,这篇主要介绍TCP/IP协议。TCP/IP协议其实是一个协议簇,其中...
    darrenW阅读 564评论 0 0