基础概念
- 网络编程:但是无论C/S,还是B/S,都离不开网络的支持。网络编程,就是在一定的协议下,实现两台计算机的通信的程序。
- 网络编程三要素:协议,IP,端口。
- 通信协议:在计算机网络中,连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。
- 体系结构:我们把计算机网络的各层及其协议的集合, 称为网络的体系结构,常见分层方式有比较简单的四层模型 TCP/IP,和七层模型OSI。
分层模型
- TCP/IP:在因特网所使用的各种协议中,最重要的和最著名的就是 TCP 和 IP 两个协议。现在人们经常提到的 TCP/I P 并不一定是单指T C P 和 I P 这两个具体的协议,而往往是表示因特网所使用的整个TCP/IP 协议族(protocol suite)
- 应用层:负责向用户提供应用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。
- 传输层:负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。
- 网络层:负责路由以及把分组报文发送给目标网络或主机。
- 链路层:负责封装和解封装IP报文,发送和接受ARP/RARP报文等。
- OSI模型
- 应用层:网络服务与最终用户的一个接口。负责向用户提供应用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。
- 表示层:数据的表示、安全、压缩。
- 会话层:建立、管理、终止会话。
- 传输层:负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。
- 网络层:进行逻辑地址寻址,负责路由以及把分组报文发送给目标网络或主机。
- 数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。
- 物理层:建立、维护、断开物理连接。
协议
运输层主要使用以下两种协议:
1. TCP:面向连接,安全协议,三次握手。 速度稍慢。
-
传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。
-
三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。
-
第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
-
第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
-
第三次握手,客户端再次向服务器端发送确认信息,确认连接。整个交互过程如下图所示。
-
-
-
完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛,例如下载文件、浏览网页等。
2. UDP:无连接,不安全协议。 速度快。
-
用户数据报协议(User Datagram Protocol)。UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。
-
特点:数据被限制在64kb以内,超出这个范围就不能发送了。
https://www.cnblogs.com/fundebug/p/differences-of-tcp-and-udp.html
IP地址
-
IP地址:指互联网协议地址(Internet Protocol Address),俗称IP。IP地址用来给一个网络中的计算机设备做唯一的编号。假如我们把“个人电脑”比作“一台电话”的话,那么“IP地址”就相当于“电话号码”。
IP地址分类
-
IPv4:是一个32位的二进制数,通常被分为4个字节,表示成
a.b.c.d
的形式,例如192.168.65.100
。其中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个。 -
IPv6:由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发紧张。
为了扩大地址空间,拟通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成
ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
,号称可以为全世界的每一粒沙子编上一个网址,这样就解决了网络地址资源数量不够的问题。
常用命令
-
查看本机IP地址,在控制台输入:ipconfig
-
检查网络是否连通,在控制台输入:
ping 空格 IP地址
ping 220.181.57.216
特殊的IP地址
-
本机IP地址:
127.0.0.1
、localhost
。
端口
网络的通信,本质上是两个进程(应用程序)的通信。每台计算机都有很多的进程,那么在网络通信时,如何区分这些进程呢?
如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的进程(应用程序)了。
-
端口号:用两个字节表示的整数,它的取值范围是0~65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。
利用 协议
+IP地址
+端口号
三元组合,就可以标识网络中的进程了,那么进程间的通信就可以利用这个标识与其它进程进行交互。
TCP
82. tcp 为什么要三次握手,两次不行吗?为什么?
在用tcp链接发送数据之前,会先进行三次握手以建立链接,然后发送数据。
第一次握手:客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯初始序号。请求发送后,客户端便进入 SYN-SENT 状态。
第二次握手:服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入 SYN-RECEIVED 状态。
第三次握手:当客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入 ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED 状态,此时连接建立成功。
如果是两次握手如果出现了客户端向服务端发送链接但是因为网络延迟的原因没有连接成功,于是再次发送连接,成功连接,然后第一次连接服务端也收到了,成功建立连接,这个连接会一直等待客户端的数据交互,但客户端以为这次连接失败了于是放弃了,会让服务端浪费很多资源。
83. 说一下 tcp 粘包是怎么产生的?
①. 发送方产生粘包
采用TCP协议传输数据的客户端与服务器经常是保持一个长连接的状态(一次连接发一次数据不存在粘包),双方在连接不断开的情况下,可以一直传输数据;但当发送的数据包过于的小时,那么TCP协议默认的会启用Nagle算法,将这些较小的数据包进行合并发送(缓冲区数据发送是一个堆压的过程);这个合并过程就是在发送缓冲区中进行的,也就是说数据发送出来它已经是粘包的状态了。
②. 接收方产生粘包
接收方采用TCP协议接收数据时的过程是这样的:数据到底接收方,从网络模型的下方传递至传输层,传输层的TCP协议处理是将其放置接收缓冲区,然后由应用层来主动获取(C语言用recv、read等函数);这时会出现一个问题,就是我们在程序中调用的读取数据函数不能及时的把缓冲区中的数据拿出来,而下一个数据又到来并有一部分放入的缓冲区末尾,等我们读取数据时就是一个粘包。(放数据的速度 > 应用层拿数据速度)
HTTP
- 概念:Hyper Text Transfer Protocol 超文本传输协议
-
传输协议:定义了客户端和服务器端通信时,发送数据的格式
-
特点:
-
基于TCP/IP的高级协议
-
默认端口号:80
-
基于请求/响应模型的:一次请求对应一次响应
-
无状态的:每次请求之间相互独立,不能交互数据
-
-
历史版本:
-
1.0:每一次请求响应都会建立新的连接
-
1.1:复用连接
-
-
-
-
请求消息数据格式
-
请求行
请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1-
请求方式:
-
HTTP协议有7中请求方式,常用的有2种
-
GET:
-
请求参数在请求行中,在url后。
-
请求的url长度有限制的
-
不太安全
-
-
POST:
-
请求参数在请求体中
-
请求的url长度没有限制的
-
相对安全
-
-
-
-
-
请求头:客户端浏览器告诉服务器一些信息 请求头名称: 请求头值
-
常见的请求头:
-
User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
-
可以在服务器端获取该头的信息,解决浏览器的兼容性问题
-
-
Referer:http://localhost/login.html
-
告诉服务器,我(当前请求)从哪里来?
-
作用:
-
防盗链:
-
统计工作:
-
-
-
-
-
-
请求空行 空行,就是用于分割POST请求的请求头,和请求体的。
-
请求体(正文):
-
封装POST请求消息的请求参数的
-
-
-
响应消息数据格式:
-
响应行
-
组成:协议/版本 响应状态码 状态码描述
-
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
-
状态码都是3位数字
-
分类:
-
1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
-
2xx:成功。代表:200
-
3xx:重定向。代表:302(重定向),304(访问缓存)
-
4xx:客户端错误。
-
代表:
-
404(请求路径没有对应的资源)
-
405:请求方式没有对应的doXxx方法
-
-
-
5xx:服务器端错误。代表:500(服务器内部出现异常)
-
-
-
-
响应头:
-
格式:头名称: 值
-
常见的响应头:
-
Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
-
Content-disposition:服务器告诉客户端以什么格式打开响应体数据 * 值: * in-line:默认值,在当前页面内打开 * attachment;filename=xxx:以附件形式打开响应体。文件下载
-
-
-
响应空行
-
响应体:传输的数据
-
http和https的区别
安全性上,HTTPS是安全超文本协议,在HTTP基础上有更强的安全性。简单来说,HTTPS是使用TLS/SSL加密的HTTP协议
申请证书上,HTTPS需要使用ca申请证书
传输协议上, HTTP是超文本传输协议,明文传输;HTTPS是具有安全性的 SSL 加密传输协议
连接方式与端口上,http的连接简单,是无状态的,端口是 80; https 在http的基础上使用了ssl协议进行加密传输,端口是 443
https://blog.csdn.net/JAck_chen0309/article/details/105020259
79. http 响应码 301 和 302 代表的是什么?有什么区别?
答:301,302 都是HTTP状态的编码,都代表着某个URL发生了转移(重定向)。
区别:
-
301 redirect: 301 代表永久性转移(Permanently Moved)。
-
302 redirect: 302 代表暂时性转移(Temporarily Moved )。
详细来说,301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。
https://blog.csdn.net/grandPang/article/details/47448395
80. forward 和 redirect 的区别?
Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。
直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。
间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。
举个通俗的例子:
直接转发就相当于:“A找B借钱,B说没有,B去找C借,借到借不到都会把消息传递给A”;
间接转发就相当于:"A找B借钱,B说没有,让A去找C借"。
85. get 和 post 请求有哪些区别?
* GET:(向特定资源发出请求)
1. 请求参数在请求行中,在url后。
2. 请求的url长度有限制的
3. 不太安全
* POST:(向指定资源提交数据进行处理请求)
1. 请求参数在请求体中
2. 请求的url长度没有限制的
3. 相对安全
-
GET在浏览器回退时是无害的,而POST会再次提交请求。
-
GET产生的URL地址可以被Bookmark,而POST不可以。
-
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
-
GET请求只能进行url编码,而POST支持多种编码方式。
-
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
-
GET请求在URL中传送的参数是有长度限制的,而POST么有。
-
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
-
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
-
GET参数通过URL传递,POST放在Request body中。
其他
87.说一下 JSONP 实现原理?
jsonp 即 json+padding,动态创建script标签,利用script标签的src属性可以获取任何域下的js脚本,通过这个特性(也可以说漏洞),服务器端不在返货json格式,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。
IP地址:IP是32位二进制数据,通常以十进制表示,并以“.”分隔。IP地址是一种逻辑地址,用来标识网络中一个个主机,IP有唯一性(指的是公网地址),即每台机器的IP在全世界是唯一的。
电脑之间要实现网络通信,就必须要有一个合法的ip地址。IP地址=网络地址+主机地址(又称:网络号和主机号),ip地址的结构使我们可以在Internet上很方便的寻址。ip地址通常用更直观的,以圆点分隔号的四个十进制数字表示,每个数字从0到255,如某一台主机的ip地址为:128.20.4.1。在局域网里,同样也需要ip地址,一般内网的ip地址是以192.168开头的,这样很容易区分公网和内网的ip地址。
DNS:DNS是域名系统,DNS服务器用来解析域名的(域名与IP之间的解析),如果没有这东西,你必须输入网站的IP地址,有了DNS服务器,你就可以直接输入网址。
域名系统(Domain Name System)。在Internet上,域名与IP地址之间是一 一对应的,域名虽然便于人们记忆,但机器之间只能互相识别IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS服务器就是进行域名解析的服务器
子网掩码:子网掩码是用来判断任意两台计算机的ip地址是否属于同一子网络的根据。最为简单的理解就是两台计算机各自的ip地址与子网掩码进行and运算后,得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。(具体子网掩码各位的含义待补充。)
网关:
网关,又称网间连接器、协议转换器,一个网络连接到另一个网络的“关口”。
听起来是不是很拗口,简单理解一下:你有一块地,你用围墙围起来,然后在里面建造3个猪窝出售猪仔(没错,跟某场养猪一样),一个养白猪,一个养黑猪,一个养黄猪,接着你在围墙打一个门,里面所有的猪仔的进出只能通过这个门进出,这个门就叫做网关,里面的猪窝就是各个原子服务,专门提供不同的猪仔。
其中,原子服务为了安全,一般不对外开放,好比你猪仔吃什么,喝什么,别人不用管,只需要知道有猪仔就行,所有买卖猪仔的行为,只能通过这个门。
这里,我们可以看出,网关有几个作用
1、重定向:要什么颜色的猪仔,告诉我,我给你就行
2、鉴权:哪些人可以买,我说了算
3、日志:今天谁来买,买了多少猪仔,买什么颜色的猪仔,一清二楚
4、限流:每次只能限定多少人来买,超过的话,就等等吧,毕竟太忙猪仔妈妈生产不过来。