一、套接字

1、IPC

IPC:Inter Process Communication 进程间通信

IPC分为两类:

  同一主机IPC:

    信号、旗语、shm

    Unix Sock

  主机IPC:

    rpc

    socket


2、套接字

   套接字是IPC(进程间通信)的一种实现,允许位于不同主机(甚至同一主机)通上不同进程间信

套接字 = ip + 端口

   ip:主机间通信

  端口:进程间通信

  网络间通信本质是进程间通信

  进程是程序的副本,可以有多个,多个副本都是不同的进程


3、套接字的两类

Uix Sock:在同一主机间通信,基于文件系统通信,不需要通过网络通信

Socket:ip:port 不同主机间通信,BSD 1983,4发明         

  TCP套接字SOCK_STREAM

  UCP套接字SOCK_DGRAM

  RAW套接字SOCK_RAW,应用层自己控制报文传输

   套接字是通信端点的抽象,实现端对端之间的通信。与应用程序要使用文件描述符访问文件一样,访问套接字需要套接字描述符。

family表示套接字的通信域,不同的取值决定了socket的地址类型,其一般取值如下:  
AF_INET        IPv4因特网域   
AF_INET6        IPv6因特网域   
AF_UNIX        Unix域,同一主机上不同进程之间通信时使用   
AF_ROUTE        路由套接字   
AF_KEY         密钥套接字  
AF_UNSPEC       未指定  

type确定socket的类型,常用类型如下:  
SOCK_STREAM      有序、可靠、双向的面向连接字节流套接字  
SOCK_DGRAM      长度固定的、无连接的不可靠数据报套接字   
SOCK_RAW       原始套接字  
SOCK_SEQPACKET      长度固定、有序、可靠的面向连接的有序分组套接字   

protocol指定协议,常用取值如下:   
0          选择type类型对应的默认协议   
IPPROTO_TCP     TCP传输协议  
IPPROTO_UDP     UDP传输协议  
IPPROTO_SCTP     SCTP传输协议  
IPPROTO_TIPC     TIPC传输协议

每类套接字都至少提供了两种socket:

  :可靠地传递、面向连接、无边界

  数据报:不可靠地传递,有边界


4、套接字相关的系统调用

  socket():创建一个套接字

  bind():绑定

  listen():监听

  accept():接收请求

  connect():请求连接简历

  write():发送数据

  read():接收数据

  send(),recv(),sednto(),recvfrom()


5、IANA

  The Internet Assigned Numbers Authority  互联网数字分配机构

  IANA是负责协调一些使Internet正常运作的机构。同时,由于Internet已经成为一个全球范围的不受集权控制的全球网络,为了使网络在全球范围内协调,存在对互联网一些关键的部分达成技术共识的需要,而这就是IANA的任务。

IANA分配和维护在互联网技术标准(或者称为协议)中的唯一编码和数值系统。

IANA的所有任务可以大致分为三个类型:

域名,IANA管理DNS域名根和.int,.arpa域名以及IDN(国际化域名)资源。

数字资源,IANA协调全球IP和AS(自治系统)号并将它们提供给各区域Internet注册机构。

协议分配,IANA与各标准化组织一同管理协议编号系统。

IANA是全球最早的Internet机构之一,其历史可以追溯到1970年。今天,IANA被负责协调IANA责任范围的非营利机构ICANN(Internet Corporation for Assigned Names and Numbers,互联网名称与数字地址分配机构)掌管。


端口:   

   端口是16位的,也就是端口最大的值可以达到2^16-1,所以一共有2^16-1+1=65536个端口。再加一个1是因为最大值是65535,而计算机中是从0开始计算的,所以要加上全0这个端口。

 固定端口(0-1023)

    永久的分配给固定的应用使用,也被称为特权端口,管理员才有权限使用

    由于这些端口紧绑于一些服务,所以我们会经常扫描这些端口来判断对方是否开启了这些服务,如TCP的21(ftp),80(http),443(https),139(netbios),UDP的7(echo)等等一些大家熟知的端口; 

 动态端口(1024-49151): 

   这些端口并不被固定的捆绑于某一服务,操作系统将这些端口动态的分配给各个进程,同一进程两次分配有可能分配到不同的端口。不过一些应用程序并不愿意使用操作系统分配的动态端口,他们有其自己的‘商标性’端口,如oicq客户端的4000端口,***冰河的7626端口等都是固定而出名的。 

 49152-65535:客户端程序随机使用的端口


二、HTML

1、HTML简介

HTML:Hyper Text Mark-up Language  超文本标记语言,创建网页的标准标记语言

    标记语言不是编程语言,是一套标记标签(简称标签)

什么是超文本?

  有超链接的文本(纯ASCII码)

什么是有超链接的文本?

  遵循html格式所研发的文本


  可以使用HTML来建立自己的WEB站点,HTML运行在浏览器上,由浏览器来解析。

  Web浏览器(如谷歌浏览器,Internet Explorer,Firefox,Safari)是用于读取HTML文件,并将其作为网页显示。浏览器并不是直接显示的HTML标签,但可以使用标签来决定如何展现HTML页面的内容给用户

  HTML是WWW的描述语言,设计HTML语言的目的是为了能把存放在一台电脑中的文本或图形与另一台电脑中的文本或图形方便地联系在一起,形成有机的整体,人们不用考虑具体信息是在当前电脑上还是在网络的其它电脑上。这样,你只要使用鼠标在某一文档中点取一个图标,Internet就会马上转到与此图标相关的内容上去,而这些信息可能存放在网络的另一台电脑中。

  

2、HTML文件的格式

html格式的文件(网页文件):

<html>
    <head>                      首部
         <title> </title>               标题
    </head>
    <body>                    内容
              <h1></h1>            标题1
                    <p></p>          段落1
                                         段落2
              <h2></h2>            标题2
                    <p></p>         段落1
          </body>
</html>

实例:

<!DOCTYPE html>    #声明为 HTML5 文档
<html>             #HTML 页面的根元素
<head>             #包含了文档的元(meta)数据
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)         #描述了文档的标题(网页的标签上显示的内容)
</title>
</head>
<body>                              #包含了可见的页面内容
    <h1>我的第一个标题</h1>         #元素定义一个大标题
    <p>我的第一个段落</p>         #定义一个段落
</body>
</html>


<title> </title>:

   之间的文字就是这个网页的标题,即你浏览网页时浏览器顶部每个网页标签条里显示的文字。
<head> </head>:

   一般是引入该网页中使用的各种CSS样式表,js库等,也可以在里面定义CSS样式或者编写js等。你可以理解成其他语言里的引入头文件。

head标签用于定义文档的头部,它是所有头部元素的容器,head包含title

title定义文档的标题,它是head部分中唯一必需的元素。title的内容是可以直接显示在浏览器tab上的

html文档的后缀:

 .html

 .htm

以上两种后缀名没有区别,都可以使用。

注意:HTML中不支持 空格、回车、制表符,它们都会被解析成一个空白字符。


3、WEB中常用术语

动态页面:

  程序在服务端执行(也在客户端在执行),把结果返回给客户端(程序执行的结果加上html的标签展示给客户端)

  如:php,asp,.net,jsp,perl,python,c,c++

  服务器端运行程序早期是基于CGI(Common Gateway Interface 通用网关接口)协议实现的

    硬编码

    分体式结构:嵌入html中的web开发机制

  

静态页面:

  如:.html .gif .txt .js .css .mp3

URI:Uniform Resource Identifier  统一资源标识符

    标识互联网上每个的资源的唯一性

URL:Uniform Resource Locator  统一资源定位符,是URI的子集

    用于描述某服务器某特定资源的位置

  常用格式:

     Scheme://Server:Port/path/to/resource

     方案或协议://主机名:端口/资源路径

     例如:http://www.magedu.com/p_w_picpaths/logo.jpg

http协议认证的详细格式:

    <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

    params:参数

URN:统一资源命名符,是URI的子集

一个页面中,可能包含多个对象


三、http

1、http简介

http:hyper text transfer protocol  超文本传输协议

  http协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等


2、http协议版本

  HTTP/0.9:1991,原型版本,仅用于传输html文档,功能简陋不支持多媒体

  HTTP/1.0:第一个广泛使用的版本,支持MIME,使用keep-alive保持连接的机制实现持久连接,有缓存功能

  HTTP/1.1:更多的请求方法,更精细的缓存控制,原生持久连接

  spdy:加速浏览器获取资源速度

  HTTP/2.0:整合spdy协议的优势 


MIME:Multipurpose Internet Mail Extesion   多用途互联网邮件扩展,开始是使用在邮件中,后面被引入http协议中

  基于文本传输协议传输非文本数据,

  base64(编码方式):将二进制数据编码成文本发送,并能够让接收方还原回原来的格式

媒体类型(MIME类型):

    格式:major/minor     主类型/子类型

        HTML:text/html

       ASCII:text/plain

        JPEG:p_w_picpath/jpeg

    QuickTime:p_w_picpath/gif

图片是二进制格式的


3、HTTP协议的主要特点
 客户/服务器模式
         

 简单快速客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

   灵活HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

  无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。

     效率很低,加速方式:并行和持久连接    


HTTP协议是无状态的和Connection: keep-alive的区别:
  无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
  HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。


4、一次完整的http请求过程

 1)建立连接:

    名称解析(DNS查询)     

    TCP的三次握手

 2)接收请求

      接收来自于网络的请求报文中对某资源的一起请求过程                   

 3)处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息

    元数据:请求报文首部

      <method> <URL> <VERSION>

    请求的方法

      host:www.magedu.com 请求的主机名称

      connection:连接方式

 4)访问资源:获取请求报文中请求的资源

   web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态资源执行后生成的资源,这些资源放置于本地文件系统某路径下,此路径通常称为DocRoot(文档根)

 5)构建响应报文

   MIME类型:

        显示分类

        魔法分类

        协商分类

  URL重定向:

       web服务构建的响应并非客户端请求的资源,而是资源的另一个访问路径

 6)发送响应报文

 7)记录日志


HTTP事务时延:

 1)DNS解析

 2)连接(tcp三次握手)

 3)资源请求过程

 4)(断开)tcp四次挥手

提高性能:

 并行连接

 持久连接


四、http报文详解

1、http报文格式

HTTP事务:一次http请求以及对应的响应 

http请求:request  使用HTTP请求报文

 报文格式:

   <method> <request-URL> <version>    #方法 请求的URL http协议的版本

   <headers>       #请求报文首部,可以有多个

                 #1个空白行

   <entity-boby>    #请求的主(实)体内容

  

http响应:response  使用HTTP响应报文

 报文格式:

   <version> <status> <reason-phrase>     #http协议的版本 响应状态码 原因短语

   <headers>     #响应报文首部,可以有多个

               #1个空白行    

   <entity-boby>  #响应的主体内容

注意:对于请求报文和响应报文的第一行都叫做起始行,也分别叫请求行响应行


2、http报文中各元素详解

<method>:请求方法,希望服务器端执行的动作,如GET、HEAD、POST等          

 安全的方法:客户端只请求资源,不需要操作服务器的资源

    GET从服务器获取一个资源,需要服务器发送资源

    HEAD跟GET相似,但不需要服务器发送资源而仅传回响应首部

不安全的方法:

    POST向服务器发送要处理的数据,支持HTML表单提交,表单中有用户填入的数据,发送给服务器端,由服务器存储

    PUT:与GET相反,向服务器写入文档:发布系统。将请求的主体部分存储在服务上,

   DELETE:请求删除URL指向的资源

   TRACE:追踪请求到达服务器中间经过的防火墙、代理服务器或网关

  OPTIONS探测服务器对指定资源支持使用的请求方法

扩展的方法:

  LOCK(加锁),MKCOL(允许用户创建资源),COPY,MOVE, 

<request-url>:请求的资源可以是相对路径,也可以是完整的URL

<version>:协议版本

       格式:HTTP/<major>.<minor> 如:http/1.0

<headers>:HTTP首部

<status>:响应状态码

<reason-phrase>原因短语,数字状态码易读信息,状态码所标记的状态的简要描述

<entity-body>:主体部分


3、响应报文状态码

  三位数字,如200,301,302,404,502;标记请求处理过程中发生的情况

1XX:信息提示性状态码

   100请求继续补充内容

   101请求转换协议

2XX:成功状态码

   200:OK,发送成功,请求没问题

   201:Created OK,创建成功,接收并保存

3XX:重定向状态码

   301:Moved Permanebtly 永久重定向请求的URL指向的资源已经被删除,但通过在响应报文中使用首部“Location:URL”指定资源现在所在的位置,后续对该资源的请求直接请求新的URL

   302:Found 临时重定向在响应报文中使用首部“Location:URL”指定临时资源位置,后续对该资源的请求还得请求该URL

   304:Not Modified,客户端发出条件式请求,但服务器上的资源未曾发生改变,使用缓存;则通过响应此响应码通知客户端NOT Modified

4XX:客户端类的错误

   403:Forbidden,请求被服务器拒绝,无权限

   404:Not Found,服务器无法找到请求的URL

   405:Method Not Allowed,不允许使用此方法请求相应的URL

5XX:服务器类的错误

   500:Internal Server Error,服务器内部错误,有语法、配置错误

   502:Bad Gateway:代理服务器从上游收到一条伪响应

   503:Service Unavailable,服务器此时无法提供服务,但将来可能可用


五、http首部(headers)

格式:Name: Value

  使用名称:值的格式定义特定的属性和需求

首部分为三类:

1、通用首部

   请求和响应报文中都可以使用

Date:报文的创建时间

Connection:定义C/S之间请求/响应的有关选项:连接方式,如对于http/1.0,Connect:Keep-alive

Via:显示报文经过的中间节点

Cache-Control:缓存指示,控制缓存,http/1.1中

Pragma:http/1.0中


2、请求首部

Accept首部:用于标明客户自己更倾向于支持使用的能力(方式)

  Accept:通知服务器自己可接收的媒体类型

  Accept-Charset:支持使用的字符集

  Accept-Encoding:通知服务器自己可接收的编码格式。如gzip

  Accept-Language:支持使用的语言

信息式请求首部:

  client-IP:客户端ip,为什么这里还需要CIP?IP报文中不是有源IP吗?

  Host:请求的服务器名称和端口号;虚拟主机环境下用于标识不同的虚拟主机

  Referer指明了请求当前资源的原始资源的URL

  User-Agent客户端代理类型,使用什么工具发出的请求

条件式请求首部:

  Expect:期望的行为

  If-Modified-Since:是否在指定的时间以来修改过此资源,如果修改过就发送新的资源,响应码为200,没修改过则发送缓存,响应码304 Not Modified

  If-Unmodified-Since:

  If-None-Match:本地缓存中存储的文件Etag标签是否与服务器不匹配

跟安全相关的请求首部:

  Authorication:客户端提交给服务端的认证数据,如账号和密码

  Cookie:客户端发送给服务器端身份标识

  Cookie2:第二版Cookie,功能更强大

代理请求首部:

  proxy-Authorization:向代理服务器认证


3、响应首部

  Age:响应持续的时间

  Server:向客户端标明服务器程序名称和版本

协商首部:某资源有多种和表示方法时使用

  Accept-Ranges:对当前资源来讲,服务器所能够接受的范围类型

  Vary首部列表,服务器会根据列表中的内容挑选出最适合的版本发送给客户端

跟安全相关的响应首部

  Set-Cookie服务器端在某客户端第一次请求时发给的令牌

  Set-Cookie2

  WWW-Authenication:质询,即要求客户端提供账号和密码


4、实体(主体)首部

   用于指定实体属性       

 Location:指定资源的新位置

  Allow:允许对此资源使用的请求方法

内容首部:

  Contern-Encoding:实体编码

  Contern-Language:实体语言

  Contern-Length  实体长度

  Contern-type    实体类型

  Contern-Range   实体字节范围

  Contern-Location  实体真正所处位置

缓存首部:

  ETag:实体的扩展标签

  Expires:实体过期期限

  Last-Modified:上一次的修改时间    


5、扩展首部

   非标准首部,可能是由程序开发者创建的,例如:X-Forward-For


六、http协议的实现

1、http架构

http:C/S

 Client:

     GUI:

        IE,Firefox,chrome,Opera,Safari

     CLI:纯字符界面,不能显示图片

        elinks,curl

 Server:

     httpd,nginx,lighttpd(德国),gws(谷歌)

APP Server(应用程序服务器)

     iis,tomcat,jetty,jboss,resin

     webshere,weblogic,oc4j