一、总概
OSI模型和 TCP/IP模型:
各层详解
【1】物理层:将数据转换为可通过物理介质传送的电子信号。主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换),这一层的数据叫做比特。
【2】数据链路层:决定访问网络介质的方式。定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问,这一层通常还提供错误检测和纠正,以确保数据的可靠传输。
【3】网络层:使用权数据路由经过大型网络。在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择,Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
- 涉及的协议:IP/IPX
【4】传输层:提供终端到终端的可靠连接。定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的), 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组,常常把这一层数据叫做段。
- 传输层协议有TCP 、UDP ,还有 TLS(安全运输协议) · DCCP(数据报拥塞控制协议) · SCTP(流控制传输协议) ·RSVP(资源预留协议) · PPTP(点对点隧道协议)。
【5】会话层:允许用户使用简单易记的名称建立连接。通过传输层(端口号:传输端口与接收端口)建立数据传输的通路,主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。
【6】表示层:协商数据交换格式。可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
【7】应用层: 用户的应用程序和网络之间的接口。是最靠近用户的OSI层,这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。
- 应用层的主要协议:HTTP,HTTPS,FTP(上传,下载),SMTP(邮件)
HTTP协议:超文本传输协议,包括url地址,域名,源地址,发送的数据方法(Get,Post等),浏览器信息等
物理层、数据链路层、网络层之间的区别:
TCP/IP协议
全称.Transmission Control Protocol/Internet Protocol 的简写,
国际标准化组织制定了这样一个网络协议的模型,但是实际上互联网通讯使用的网络协议是TCP/IP网络协议。
TCP/IP 是一个协议族,也是按照层次划分。共四层:应用层,传输层,互连网络层,网络接口层。 那么TCP/IP协议和OSI模型有什么区别呢?OSI网络协议模型,是一个参考模型,而TCP/IP协议是事实上的标准。TCP/IP协议参考了OSI 模型,但是并没有严格按照OSI规定的七层去划分标准,而只划分了四层,个人觉得这样会更简单点,当划分太多层次时,你很难区分某个协议是属于哪个层次 的。TCP/IP协议和OSI模型也并不冲突,TCP/IP协议中的应用层协议,就对应于OSI中的应用层,表示层,会话层。就像以前有工业部和信息产业 部,现在实行大部制后只有工业和信息化部一个部门,但是这个部门还是要做以前两个部门一样多的事情,本质上没有多大的差别。TCP/IP中有两个重要的协 议,传输层的TCP协议和互连网络层的IP协议,因此就拿这两个协议做代表,来命名整个协议族了,在说TCP/IP协议时,是指整个协议族。
在TCP/IP中包含一些列的用于处理数据通信的协议:
- TCP(传输控制协议)--应用程序之间的通信
- UDP(用户数据包协议)--应用程序之间的简单通信
- IP(网络协议) -- 计算机之间的通信
- ICMP(因特网消息控制协议) -- 针对错误的状态
- DHCP(动态主机配置协议) -- 针对动态寻址
TCP(Transmission Control Protocol 传输控制协议)
一、TCP的特点和报文结构
1、面向连接、可靠传输、面向字节流、全双工服务
可靠数据传输、流量控制、拥塞控制。
TCP将在两个应用程序之间建立一个全双工(full - duplex)的通信.
这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止.
2、TCP的报文结构
TCP报文段由首部字段和一个数据字段组成。
数据字段包含一块应用数据。最大报文长度MSS(Maximum Segment Size)限制了报文段数据字段的最大长度。MSS选项用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度。
二、三次握手
-数据开始传输前,需要通过 三次握手来建立连接
- 客户端的TCP首先向服务端的TCP发送一条特殊的TCP报文段。该报文段不包含应用层数据,该报文段首部中的一个标志位(SYN比特)被置为1,所以该报文段被称为SYN报文段。另外,客户会随机选择一个初始序号client_isn,并将该序号放置于该起始的TCP SYN报文段的序号字段中。
客户端和服务端最开始都处于CLOSED状态,发送过该 SYN报文段后,客户端TCP进入SYN_SENT状态,等待服务端确认并将SYN比特置为1的报文段。 - 收到SYN报文段后,服务端会为该TCP连接分配TCP缓存和变量,服务端TCP会进入SYN_RCVD状态,等待客户端TCP发送确认报文段。
并向该客户端TCP发送允许连接的报文段,该报文段同样不包含应用层数据。该报文段首部的SYN比特被置为1,确认号字段被置为client_isn+1。服务端还会选择自己的初始序号server_isn,放到报文段首部的序号段中。该连接被称为SYNACK报文段。 - 收到SYNACK报文段后,客户端也要为该TCP连接分配缓存和变量,客户端TCP进入ESTABLISHED状态,在此状态,客户端就能发送和接收包含有效载荷数据的报文段了。
并向服务端TCP发送一个报文段:这最后一个报文段对服务端的允许连接的报文表示了确认(将server_isn + 1放到报文段首部的确认字段中)。因为连接已经建立了,所以该SYN比特被置为0。这个阶段,可以在报文段负载中携带应用层数据。
收到客户端该报文段后,服务端TCP也会进入ESTABLISHED状态,可以发送和接收包含有效载荷数据的报文段。
三、四次挥手
参与TCP连接的两个进程中的任何一个都能终止该连接,当连接结束后,主机中的资源(缓存和变量)会被释放。
- 客户应用进程发出一个关闭连接的指令。会引起客户端TCP向服务端发送一个特殊的TCP报文段。该报文段即是将首部的一个标志位FIN比特置为1。
同时,客户端进入FIN_WAIT_1状态,等待服务端的带有确认的TCP报文段。 - 收到该报文段后会向客户端发送一个确认报文段。
服务端TCP进入CLOSE_WAIT状态,对应客户端的TIME_WAIT,表示被动关闭。
客户端收到该报文段后,进入FIN_WAIT_2状态,等待服务端的FIN比特置为1的报文段。 - 服务端发送自己的终止报文段,同样是把报文段首部的标志位FIN比特置为1。
服务端TCP进入LAST_ACK状态,等待服务端最后的确认报文段。 - 客户端收到服务端的终止报文段后,向服务端发送一个确认报文段。同时,客户端进入TIME_WAIT状态。
假如ACK丢失,TIME_WAIT状态使TCP客户重传最后的确认报文,TIME_WAIT通常会等待2MSL(Maximum Segment Lifetime 最长报文段寿命)。经过等待后,连接就正式关闭,重新进入CLOSED状态,客户端所有资源将被释放。
服务端收到该报文段后,同样也会关闭,重新进入CLOSED状态,释放所有服务端TCP资源。
一些问题
1、问:为什么建立连接只用三次握手,而断开连接却要四次挥手?
首先,当客户端数据已发送完毕,且知道服务端也全部接收到了时,就会去断开连接即向服务端发送FIN
服务端接收到客户端的FIN,为了表示接收到了,就会向客户端发送ACK
但此时,服务端可能还在发送数据,并没有关闭TCP窗口的意思,所以服务端的FIN和ACK并不是同步发的,只有当数据发送完了,才会发送FIN
答:服务端的FIN和ACK需要分开发,并不是像三次握手中那样,SYN可以和ACK同步发,所以就需要四次挥手
2、在四次挥手中,客户端为什么在TIME_WAIT后必须等待2MSL时间呢?
答:为了保证客户端发送的最后一个ACK报文段能够到达服务端。
3、TCP在创建连接时,为什么需要三次握手而不是两次或四次?
答:两次握手会可能导致已失效的连接请求报文段突然又传送到了服务端产生错误,四次握手又太浪费资源
UDP(User Datagram Protocol 用户数据报协议)
UDP的特点
UDP是是面向非连接的协议,传送数据不需要和服务器连接,只需要知道ip和监听端口,不需要链接没有目的的socket,只是将数据报投递出去,不管接收方是否成功接收到,是一种不可靠的传输。
既然UDP是不可靠数据传输协议,那为什么那么多应用去选择UDP呢?
1、关于何时、发送什么数据的应用层控制更加精细
只要应用将数据传递给UDP,UDP就会将此数据打包进UDP报文段并立刻将其传递给网络层。
而TCP则是有个拥塞控制机制,以确保数据能够安全传输,而不管可靠传输成功需要用多少时间。
所以有些实时应用,比如微信视频、语音都是更希望数据能够及时发送,为此可以容忍一部分数据丢失,比较适合用UDP。
2、无需连接建立
众所周知,TCP在数据传输前需要经过三次握手,UDP却不需要做任何的准备即可进行数据传输,因此UDP不会引入建立连接的时延。
这也是DNS运行在UDP而不是TCP上的主要原因。
而HTTP协议之所以使用TCP,是因为对于HTTP协议来说,可靠性是至关重要的。
3、无连接状态
TCP需要维护连接状态。此连接状态包括接收和发送缓存、拥塞控制参数以及序号与确认号的参数。(后面如果有时间,会详细说下TCP的拥塞控制方案,对该方案来说,这些状态信息都是必要的)
而UDP不需要维护连接状态,也不用跟踪这些参数
4、分组首部开销小
每个TCP报文段都有20字节的首部开销,而UDP仅有8字节的开销
所以,如非必要,比如电子邮件,远程终端服务,web,以及文件传输,需要可靠地数据传输,会去采用TCP。其余的尤其是对实时性要求高的应用,比如实时视频会议,网络电话,一般都会选用UDP。
IP
是无连接的
IP用于计算机之间的通信,
IP 是无连接的通信协议.所以它不会占用两个正在通信的家算计之间的通信线路.这样,IP就降低了对网络线路的需求.每条线可以同时满足许多不同的计算机之间的通信需要.
通过IP,消息(或者其他数据)被分割成小的独立的包,并通过因特网在计算机之间传递.
IP 负责将每个包路由至它的目的地.
这其中关联到IP路由器
当一个IP包从一台计算机被发送,它会到达一个IP路由器.
IP路由器负责将这个包路由至它的目的地,直接地或者通过其他的路由器.
在一个相同的通信中,一个包经由的路径可能会和其他的包不同.而路由器负责根据通信量,网络中的错误或者其他参数来进行正确地寻址.
TCP / IP
TCP / IP 意味着TCP/IP在一起协同工作.
TCP负责应用软件(比如某一个浏览器)和网络软件之间的通信.
IP负责计算机之间的通信..
TCP负责将数据分隔并装入IP包,然后它们到达的时候将会重新组合它们.
IP负责将包发送至接受者.
TCP/IP使用32个比特或者4个0到255之间的数字来为计算机编址
IP地址
每个计算机必须有一个IP地址才能够炼乳因特网.
每个IP包必须有一个地址才能够发送到另一台计算机.
TCP/IP使用4个数字来微计算机编址.每个计算机必须有一个唯一的4个数字的地址.
数字在0到255之间,并有点号隔开.例如:192.168.1.60
32比特 == 4个字节
TCP/IP使用32个比特来编址.一个计算机字节是8比特.所以TCP/IP使用了4个字节.
一个计算机自己可以包含256个不同的值:
从00000000,00000001,00000010,00000011,直到11111111.
DNS
域名系统(Domain Name System,DNS)
将用户提供的主机名解析为IP地址
12个阿拉伯数字很难记忆.使用一个名称更加容易被记住.
用于TCP/IP 地址的名字被成为域名.baidu.com就是一个域名.
当键入一个像http://www.jianshu.com这样的域名时,域名会被一种DNS程序翻译成为数字.
在全世界,数量庞大的DNS服务器被炼乳因特网.DNS服务器负责将域名翻译为TCP/IP地址,同事负责使用新的域名信息更新彼此额系统.
当一个新的域名联通其TCP/IP地址一同注册后,全世界的DNS服务器都会对此信息进行更新.
socket
Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,是应用层与TCP/IP协议族通信中间的软件抽象层, 是它的一组接口。包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
Socket同时支持TCP和UDP两种传输协议,当Socket使用TCP协议通信的时候, Socket就是一个TCP的连接, 那么如果Socket使用的是UDP协议通信, 那么这时候的Socket就是UDP连接.
HTTPS和HTTP的区别
HTTP更符合原义的译名应该为“超文本转 移协议”。
HTTPS协议 = HTTP协议 + SSL/TLS协议
SSL的全称是Secure Sockets Layer,即安全套接层协议,是为网络通信提供安全及数据完整性的一种安全协议。TLS的全称是Transport Layer Security,即安全传输层协议。
即HTTPS是安全的HTTP。
SOAP可以使用HTTP协议进行传输吗?
SOAP全称“Simple Object Access Protocol”,代表“简单对象访问协议”, SOAP是一种通过Internet传输消息或少量信息的方法。
SOAP消息采用XML格式,通常使用HTTP(超文本传输协议)发送。两者都是广泛支持的数据传输标准,HTTP是Web页面发送的协议,它还有一个额外的优点,就是可以避免大多数网络防火墙。由于防火墙通常不会阻塞端口80 (HTTP)流量,所以大多数SOAP消息都可以顺利通过。
每个SOAP消息都包含在一个“信封”中,其中包括一个头和一个正文。消息头可能包括消息ID和发送消息的日期,而正文包含实际的消息。因为SOAP消息都使用相同的格式,所以它们与许多不同的操作系统和协议兼容。
例如,用户可以从Windows XP机器向基于Unix的Web服务器发送SOAP消息,而不必担心消息被更改。然后,Unix机器可以将消息重定向到适当的位置,或者使用系统上的程序打开文件。
在了解SOAP协议的过程中,看到介绍说soap可以通过tcp,udp,http协议来传送。这也是让人困惑的描述。一看这句话,就会感觉http怎么 和tcp,udp协议并列了呢?难道http还是属于传输层的协议?再加上http中文译名的问题,名字听上去像传输层,初学者又要开始头大了。
事实上,http是应用层的协议,这一点可以毫无怀疑。那么现在新的问题来了。soap和http都是应用层协议,怎么说soap能用http协议来传输呢?应用层的协议可以用应用层的协议传送吗?
soap将信息进行XML的序列化后,再用http协议的方式再打包进行传送,传送的方式还是tcp或者udp。做个比喻 就好理解了。tcp 和 udp 都是公路,暂且把tcp认为是一般公路,udp高速公路,soap和http就都是汽车,那么soap和http都可以在tcp和udp上跑。说soap 可以通过http来传送,实际就是说soap是小轿车,http是装轿车的卡车,把soap的信息装到http里面,然后再运输,当然走的道路还是tcp 或udp。
说soap可以通过http协议来传输,这句话不太准确,比较准确第说法是:soap信息可以通过http协议包装后通过tcp或udp传输。
HTTPS的连接建立流程
HTTPS为了兼顾安全与效率,同时使用了对称加密和非对称加密。在传输的过程中会涉及到三个密钥:
服务器端的公钥和私钥,用来进行非对称加密
客户端生成的随机密钥,用来进行对称加密
HTTPS连接过程大致可分为八步:
1、客户端访问HTTPS连接。
客户端会把安全协议版本号、客户端支持的加密算法列表、随机数C发给服务端。
2、服务端发送证书给客户端
服务端接收密钥算法配件后,会和自己支持的加密算法列表进行比对,如果不符合,则断开连接。否则,服务端会在该算法列表中,选择一种对称算法(如AES)、一种公钥算法(如具有特定秘钥长度的RSA)和一种MAC算法发给客户端。
服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人。
在发送加密算法的同时还会把数字证书和随机数S发送给客户端
3、客户端验证server证书
会对server公钥进行检查,验证其合法性,如果发现发现公钥有问题,那么HTTPS传输就无法继续。
4、客户端组装会话秘钥
如果公钥合格,那么客户端会用服务器公钥来生成一个前主秘钥(Pre-Master Secret,PMS),并通过该前主秘钥和随机数C、S来组装成会话秘钥
5、客户端将前主秘钥加密发送给服务端
是通过服务端的公钥来对前主秘钥进行非对称加密,发送给服务端
6、服务端通过私钥解密得到前主秘钥
服务端接收到加密信息后,用私钥解密得到主秘钥。
7、服务端组装会话秘钥
服务端通过前主秘钥和随机数C、S来组装会话秘钥。
至此,服务端和客户端都已经知道了用于此次会话的主秘钥。
8、数据传输
客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。
同理,服务端收到客户端发送来的密文,用服务端密钥对其进行对称解密,得到客户端发送的数据。
总结:
会话秘钥 = random S + random C + 前主秘钥
HTTPS连接建立过程使用非对称加密,而非对称加密是很耗时的一种加密方式
后续通信过程使用对称加密,减少耗时所带来的性能损耗
其中,对称加密加密的是实际的数据,非对称加密加密的是对称加密所需要的客户端的密钥。
Cookie 和Session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie相比session不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。而session存储在服务端,可以无限量存储
5、所以:将登录信息等重要信息存放为session;其他信息如果需要保留,可以放在cookie中
对称加密和非对称加密
1、对称加密
用同一套密钥来进行加密解密。
对称加密通常有 DES,IDEA,3DES 加密算法。
2、非对称加密
用公钥和私钥来加解密的算法。
公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分,私钥则是非公开的部分,私钥通常是保存在本地。
用公钥进行加密,就要用私钥进行解密;反之,用私钥加密,就要用公钥进行解密(数字签名)。
由于私钥是保存在本地的,所以非对称加密相对与对称加密是安全的。
但非对称加密比对称加密耗时(100倍以上),所以通常要结合对称加密来使用。
常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
而为了确保客户端能够确认公钥就是想要访问的网站的公钥,引入了数字证书的概念,由于证书存在一级一级的签发过程,所以就出现了证书链,在证书链中的顶端的就是根CA。
从IPv4到IPv6的迁移
1、双协议栈
2、隧道
3、IPv4 IPv6共存技术-----NAT-PT
粗糙的很,逐步完善。