定义
网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。网络协议主要由三个要素组成:语义、语法及时序;语义表示要做什么,语法表示要怎么做,时序表示做的顺序。网络协议是网络上所有设备(网络服务器、计算机、交换机、路由器、防火墙等)之间通信规则的集合,它规定了通信时信息必须采用的格式和这些格式的意义。由于网络节点之间联系的复杂性,在制定协议时,通常把复杂成分分解成一些简单成分,然后再将它们复合起来。最常用的复合技术就是层次方式,网络协议的层次结构如下:(1)结构中的每一层都规定有明确的服务及接口标准。(2)把用户的应用程序作为最高层。(3)除了最高层外,中间的每一层都向上一层提供服务,同时又是下一层的用户。(4)把物理通信线路作为最低层,它使用从最高层传送来的参数,是提供服务的基础。
分层详情
为了使不同计算机厂家生产的计算机能够相互通信,以便在更大的范围内建立计算机网络,国际标准化组织(ISO)在1978年提出了“开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)。它将计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层(Physics Layer)、数据链路层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表示层(Presentation Layer)、应用层(Application Layer)。其中第四层完成数据传送服务,上面三层面向用户。对于每一层,至少制定两项标准:服务定义和协议规范。前者给出了该层所提供的服务的准确定义,后者详细描述了该协议的动作和各种有关规程,以保证服务的提供。以下为各层详细介绍:第一层:物理层规定通信设备的机械的、电气的、功能的和过程的特性,用以建立、维护和拆除物理链路连接。具体地讲,机械 特性规定了网络连接时所需接插件的规格尺寸、引脚数量和排列情况等;电气特性规定了在物理连接上传输bit流时线路上信号电平的大小、阻抗匹配、传输速率 距离限制等;功能特性是指对各个信号先分配确切的信号含义,即定义了DTE和DCE之间各个线路的功能;规程特性定义了利用信号线进行bit流传输的一组操作规程。在这一层,数据的单位称为比特(bit)。属于物理层定义的包括:以太网、调制解调器、电力线通信(PLC)、SONET/SDH、G.709、光导纤维、同轴电缆、双绞线等。
第二层:数据链路层在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧(Frame)在信道上无差错的传输,并进行各电路上的动作系列。数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。在这一层,数据的单位称为帧(Frame)。属于数据链路层的包括:Wi-Fi(IEEE 802.11)、WiMAX(IEEE 802.16)、ATM、DTM、令牌环、以太网、FDDI、帧中继、GPRS、EVDO、HSPA、HDLC、PPP、L2TP、PPTP、ISDN、STP等。
第三层:网络层在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息–源站点和目的站点地址的网络地址。如果你在谈论一个IP地址,那么你是在处理第三层的问题,这是“数据包”问题,而不是第二层的“帧”。IP是第三层问题的一部分,此外还有一些路由协议和地址解析协议(ARP)。有关路由的一切事情都在这第三层处理。地址解析和路由是三层的重要目的。网络层还可以实现拥塞控制、网际互连等功能。在这一层,数据的单位称为数据包(packet)。网络层的协议包括:IP(IPv4、IPv6)、ICMP、ICMPv6、IGMP、IS-IS、IPsec、ARP、RARP等。
第四层:传输层第4层的数据单元也称作数据包(packets)。但是,当你谈论TCP等具体的协议时又有特殊的叫法,TCP的数据单元称为段 (segments)而UDP协议的数据单元称为“数据报(datagrams)”。这个层负责获取全部信息,因此,它必须跟踪数据单元碎片、乱序到达的 数据包和其它在传输过程中可能发生的危险。第4层为上层提供端到端(最终用户到最终用户)的透明的、可靠的数据传输服务。所为透明的传输是指在通信过程中 传输层对上层屏蔽了通信传输系统的具体细节。传输层的协议包括:TCP、UDP、TLS、DCCP、SCTP、RSVP、OSPF等。
第五层:会话层这一层也可以称为会晤层或对话层,在会话层及以上的高层次中,数据传送的单位不再另外命名,而是统称为报文。会话层不参与具体的传输,它提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制。如服务器验证用户登录便是由会话层完成的。
第六层:表示层这一层主要解决拥护信息的语法表示问题。它将欲交换的数据从适合于某一用户的抽象语法,转换为适合于OSI系统内部使用的传送语法。即提供格式化的表示和转换数据服务。数据的压缩和解压缩, 加密和解密等工作都由表示层负责。
第七层:应用层应用层为操作系统或网络应用程序提供访问网络服务的接口。应用层的协议包括:DHCP、DNS、FTP、Gopher、HTTP、IMAP4、IRC、NNTP、XMPP、POP3、SIP、SMTP、SNMP、SSH、TELNET、RPC、RTCP、RTP、RTSP、SDP、SOAP、GTP、STUN、NTP、SSDP、BGP、RIP等。
概念及原理
- Socket(套接字)
套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。 - TCP连接
TCP连接包含三次握手过程,其过程介绍如下:第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”。 - Socket连接
由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket。套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。1、服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。2、客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。3、连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。 - HTTP连接
HTTP协议是建立在TCP协议之上的一种应用,HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。 - TCP/IP协议和HTTP协议之间的关系
TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。实际上HTTP协议就是建立在TCP/IP协议之上的。 - Socket和TCP/IP协议之间的关系
TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。 - TCP/IP协议,HTTP协议,Socket三者之间的关系
实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,它只是提供了一个针对TCP或者UDP编程的接口。 - TCP协议
传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 - UDP协议
用户数据报协议,是一个无连接的简单的面向数据报的传输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。 - TCP协议和UDP协议之间的区别
TCP发送的包有序号,对方收到包后要给一个反馈,如果超过一定时间还没收到反馈就自动执行超时重发,因此TCP最大的优点是可靠。一般网页(http)、邮件(SMTP)、远程连接(Telnet)、文件(FTP)传送就用TCP。UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,比如语音广播、视频、QQ、TFTP(简单文件传送)、SNMP(简单网络管理协议)、RTP(实时传送协议)RIP(路由信息协议,如报告股票市场,航空信息)、DNS(域名解释)。注重速度流畅。 - FTP协议
文件传输协议(File Transfer Protocol, FTP)是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上载文件,创建或改变服务器上的目录。
协议详解
- IP协议
IP协议是TCP/IP协议簇中的核心协议,也是TCP/IP的载体。所有的TCP,UDP,ICMP及IGMP数据都以IP数据报格式传输。IP提供不可靠的,无连接的数据传送服务。不可靠指它不能保证IP数据报能成功到达目的地。IP仅提供最好的传输服务。当发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息给信源。任何要求的可靠性必须由上层来提供。无连接指IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B)每个数据报都是独立的进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。IP实现两个基本功能:寻址和分段。IP可以根据数据包包头中包括的目的地址将数据报传送到目的地址,在此过程中IP负责选择传送的道路,这种选择道路称为路由功能。如果有些网络内只能传送小数据报,IP可以将数据报重新组装并在报头域内注明。IP模块中包括这些基本功能,这些模块存在于网络中的每台主机和网关上,而且这些模块(特别在网关上)有路由选择和其它服务功能。对IP来说,数据报之间没有什么联系,对IP不好说什么连接或逻辑链路。IP使用四个关键技术提供服务:服务类型,生存时间,选项和报头校验码。服务类型指希望得到的服务质量,服务类型是一个参数集,这些参数是Internet能够提供服务的代表,这种服务类型由网关使用,用于在特定的网络,或是用于下下一个要经过的网络,或是下一个要对这个数据报进行路由的网关上选择实际的传送参数。生存时间是数据报可以生存的时间上限,它由发送者设置,由经过路由的地方处理,如果未到达时生存时间为零,抛弃此数据报。对于控制函数来说选项是重要的,但对于通常的通信来说它没有存在的必要,选项包括时间戳,安全和特殊路由。报头校验码保证数据的正确传输,如果校验出错,抛弃整个数据报。其协议头解释如下: IP协议头
版本[4bit]指IP协议的版本。通信双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。关于IPv6,目前还处于草案阶段。
首部长度[4bit]可表示的最大十进制数值是15。请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。首部长度限制为60字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。
区分服务[8bit]用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用。
总长度[16bit]总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为65535字节。注:在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。
标识(identification)[16bit]IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
标志(flag)[3bit]占3位,但目前只有2位有意义。标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个;标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。
片偏移[13bit]片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。
生存时间[8bit]生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。最初的设计是以秒作为TTL的单位。每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把TTL值减1。当TTL值为0时,就丢弃这个数据报。
协议[8bit]协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。
首部检验和[16bit]这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化),不检验数据部分可减少计算的工作量。
源IP地址[32bit]
目的IP地址[32bit]
- TCP协议
TCP协议是面向连接、保证高可靠性(数据无丢失、数据无失序、数据无错误、数据无重复到达)传输层协议。
其协议头解释如下: TCP协议头
端口号[16bit]在TCP头中,有源端口号(Source Port)和目标端口号(Destination Port)。源端口号标识了发送主机的进程,目标端口号标识接收方主机的进程。
序号[32bit]序号分为发送序号(Sequence Number)和确认序号(Acknowledgment Number)。发送序号:用来标识从TCP源端向TCP目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的顺序号。确认序号:包含发送确认的一端所期望收到的下一个顺序号。因此,确认序号应当是上次已成功收到数据字节顺序号加1。只有ACK标志为1时确认序号字段才有效。TCP为应用层提供全双工服务,这意味数据能在两个方向上独立地进行传输。因此,连接的每一端必须保持每个方向上的传输数据顺序号。
偏移[4bit]这里的偏移实际指的是TCP首部的长度,它用来表明TCP首部中32bit字的数目,通过它可以知道一个TCP包它的用户数据是从哪里开始的。
Reserved [6bit]目前没有使用,它的值都为0
标志[6bit]在TCP首部中有6个标志位,可同时被置为1,代表意思如下:URG:紧急指针(urgent pointer)有效ACK:确认序号有效PSH:指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满RST:一般表示断开一个连接SYN:同步序号用来发起一个连接FIN:发送端完成发送任务(即断开连接)
窗口大小(window)[16bit]窗口的大小,表示源方法最多能接收的字节数。
校验和[16bit]校验和覆盖了整个的TCP报文段:TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由接收端进行验证。
紧急指针[16bit]只有当URG标志置为1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。
TCP选项是可选的
- UDP协议
传输层协议,用户数据报协议,不可靠的协议,只负责把应用层的协议的数据传送到IP层的数据报,而不管数据是否到达。它的协议头比较简单,如下: UDP协议头
端口号[16bit]与TCP一样,也有源端口号(Source Port)和目标端口号(Destination Port)。源端口号标识了发送主机的进程,目标端口号标识接收方主机的进程。
Length[16bit]标识UDP头的长度。
Checksum[16bit]校验和,包含UDP头和数据部分。
- HTTP协议
1、定义HTTP全称是HyperText Transfer Protocal,即:超文本传输协议,从1990年开始就在WWW上广泛应用,是现今在WWW上应用最多的协议,HTTP是应用层协议,并且HTTP协议是基于TCP连接的,主要解决的是如何包装协议的。当你上网浏览网页的时候,浏览器和Web服务器之间就会通过HTTP在Internet上进行数据的发送和接收。HTTP是一个基于请求/响应模式的、无状态的协议。即我们通常所说的Request/Response。
2、URL解析URL(Uniform Resource Locator:统一资源定位符)地址用于描述一个网络上的资源, 基本格式如下:schema://host[:port#]/path/…/[?query-string][#anchor]
- scheme:指定底层使用的协议(例如:http,https,ftp);
- host:HTTP服务器的IP地址或者域名;
- port:HTTP服务器的默认端口是80,这种情况下端口号可以省略,如果使用了别的端口,必须指明,例如http://www.xiaoyaoyou1212.com:8080/;
- path:访问资源的路径;
- query-string:发送给HTTP服务器的数据;
- anchor:锚。
URL的一个例子:http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff
描述
示例
描述 | 示例 |
---|---|
Schema | http |
Host | www.mywebsite.com |
Path | /sj/test/test.aspx |
Query String | name=sviergn&x=true |
Anchor | stuff |
作者:larryzhao
链接:http://www.jianshu.com/p/sTeAbC
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
3、HTTP的Request消息的结构Request消息分为3部分:Request line,Request header,body.header和body之间有个空行。
Method表示请求方法,比如”POST”,”GET”等。
Path-to-resoure表示请求的资源
Http/version-number表示HTTP协议的版本号注:当使用的是”GET”方法的时候,body是为空的,比如我们打开CSDN博客首页的request如下:
12
GET http://www.cnblogs.com HTTP/1.1Host: blog.csdn.net
Accept作用:表示浏览器端可以接受的媒体类型例如:Accept:text/html,代表浏览器可以接受服务器回发的类型为text/html,也就是我们常说的html文档,如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable);通配符代表任意类型,例如Accept:/*代表浏览器可以处理所有类型(一般浏览器发给服务器都是发这个)。
Referer作用:提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。例如:Referer:http://blog.csdn.net/xiaoyaoyou1212
Accept-Language作用:浏览器申明自己接收的语言注:语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等例如:Accept-Language: en-us
Content-Type作用:指定不同格式的请求信息例如:Content-Type: application/x-www-form-urlencoded
Accept-Encoding:作用:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)(注意:这不是指字符编码);例如: Accept-Encoding: gzip, deflate
User-Agent作用:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本例如:User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
Connection作用:表示网页下次打开时是否需要重新建立连接例如:Connection:keep-alive,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接;Connection: close,代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。
Content-Length作用:表示发送给HTTP服务器数据的长度例如:Content-Length: 38
Host(发送请求时,该报头域是必需的)作用:请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的例如:在浏览器中输入:http://blog.csdn.net/xiaoyaoyou1212,浏览器发送的请求消息中,就会包含Host请求报头域Host:http://blog.csdn.net/xiaoyaoyou1212
,此处使用缺省端口号80,若指定了端口号,则变成:Host:指定端口号
Pragma作用:防止页面被缓存,在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样例如:Pragma: no-cache
Cookie作用:最重要的header, 将cookie的值发送给HTTP服务器
Accept-Charset作用:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案)
4、HTTP的Response消息的结构Response消息分为3部分:Response line,Response header,body.header和body之间有个空行。
HTTP/version-number表示HTTP协议的版本号
Status-code表示响应码,如200、404、500等
Message状态信息描述
Cache-Control作用: 这个是非常重要的规则,用来指定Response-Request遵循的缓存机制。各个指令含义如下:
Cache-directive | 说明 |
---|---|
public | 所有内容都将被缓存(客户端和代理服务器都可缓存) |
private | 内容只缓存到私有缓存中(仅客户端可以缓存,代理服务器不可缓存) |
no-cache | 必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证令牌 (ETag),no-cache 会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载。 |
no-store | 所有内容都不会被缓存到缓存或 Internet 临时文件中 |
must-revalidation/proxy-revalidation | 如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证 |
max-age=xxx (xxx is numeric) | 缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高 |
Content-Type作用:WEB服务器告诉浏览器自己响应的对象的类型和字符集例如:
123
Content-Type: text/html; charset=utf-8
Content-Type: text/html; charset=GB2312
Content-Type: image/jpeg
Expires作用:浏览器会在指定过期时间内使用本地缓存例如:Expires: Tue, 08 Feb 2022 12:00:00 GMT
Last-Modified作用:用于指示资源的最后修改日期和时间例如:Last-Modified: Wed, 21 Dec 2011 12:00:00 GMT
Server作用:指明HTTP服务器的软件信息例如:Server: Microsoft-IIS/7.5
X-AspNet-Version作用:如果网站是用ASP.NET开发的,这个header用来表示ASP.NET的版本例如: X-> AspNet-Version: 4.0.30319
X-Powered-By作用:表示网站是用什么技术开发的例如:X-Powered-By: ASP.NET
Connection作用:表示网页下次打开时是否需要重新建立连接例如:Connection: keep-alive,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接;Connection: close,代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。
Content-Length作用:指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一起发给客户端。例如:Content-Length: 19847
Date作用:生成消息的具体时间和日期例如:Date: Sat, 11 Feb 2012 12:00:00 GMT
5、HTTP协议之GET和POSTHTTP协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE。一个URL地址用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查、改、增、删4个操作。最常见的就是GET和POST,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。其区别如下:
GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test&id=123456
,POST方法是把提交的数据放在HTTP包的Body中;
GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制;
GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值,也就是说GET是通过地址栏来传值,而POST是通过提交表单来传值;
GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。
示例
- TCP
public static void sendData(byte[] data) throws IOException {
if (data == null) {
return;
}
Socket socket = new Socket(InetAddress.getByName("192.168.1.122"), 9999);
OutputStream outputstream = socket.getOutputStream();
outputstream.write(data, 0, data.length);
outputstream.close();
socket.close();
}
public static void receiveData() throws IOException {
ServerSocket serversocket = new ServerSocket(9999);
Socket socket = serversocket.accept();
InputStream inputstream = socket.getInputStream();
byte[] buffer = new byte[1024];
int bytes = inputstream.read(buffer);
byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, data.length);
Log.i("XYY", new String(data));
inputstream.close();
socket.close();
serversocket.close();
}
- 调用如下:
new Thread(new Runnable() {
@Override
public void run() {
try {
TCP.receiveData();
TCP.sendData("逍遥游".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
- UDP
public static void sendData(byte[] data) throws IOException {
if (data == null) {
return;
}
DatagramSocket datagramSocket = new DatagramSocket();
DatagramPacket datagramPacket = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.1.122"), 9999);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
public static void receiveData() throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(9999);
byte[] receive = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(receive, receive.length);
datagramSocket.receive(datagramPacket);
Log.i("XYY", new String(receive, 0, datagramPacket.getLength()));
datagramSocket.close();
}
- 调用如下:
new Thread(new Runnable() {
@Override
public void run() {
try {
UDP.receiveData();
UDP.sendData("逍遥游".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
网友评论