目前网络中实际使用的传输协议为tcp/ip网络协议,它分为四层:应用层、传输层、网络层和网络接口层;
添加完头部做成网络层数据包,进入数据链路层(网络接口层,即以太网),该层继续添加相应的包头,包头主要包括:源MAC地址、目的MAC地址以及上层协议类型(如上层协议为ipv4协议)等信息,这样整个数据包就组合完毕,通过物理介质进行传输;
应答数据中:
应用层主要包括:http、ftp、SMTP等应用协议;传输层主要有tcp和udp协议,网络层主要有ip协议,icmp协议;
网络协议的传输过程中,数据包的封装过程为:
http数据包进入传输层,传输层会添加tcp包头,tcp包头包含了:源端口、目的端口、包序、包头长等信息;
添加完tcp包头组成tcp数据包,进入网络层,网络层添加ip数据包包头,包头信息包含:版本号(ipv4还是ipv6)、包头长、总长度、上层协议类型(如TCP)、源ip地址、目的ip地址等信息,如下图:
添加完头部做成网络层数据包,进入数据链路层(网络接口层,即以太网),该层继续添加相应的包头,包头主要包括:源MAC地址、目的MAC地址以及上层协议类型(如上层协议为ipv4协议)等信息,这样整个数据包就组合完毕,通过物理介质进行传输;
在传输的过程中,每一层都有数据包的大小限制,如数据链路层数据包最小为64个字节,最大为1518个字节,头部固定为18个字节,则数据最大为1500个字节,最小为48个字节;
网络层中数据包的最大总长度为65535个字节,ip头部长度为20到60个字节,其中前20个字节固定,后40个字节为可选,因为数据链路层中数据包最大为1500个字节,所以会进行分包;
传输层中的数据包大小,UDP协议的总长度不能够超过65535个字节,TCP协议没有长度限制,但为了保证网络效率,TCP数据包的长度不会超过IP数据包的长度,以确保TCP不会再分割;
http协议数据包格式如下图:
http中GET请求:
http数据包主要是请求(request)和应答(respose)方式,
请求方式分为八种:
POST、GET、PUT、DELETE、HEAD、TRACE、CONNECT、OPTIONS,其中比较常见的为:POST 和GET这两种请求方式,http数据包的格式已上图为例:
首先第一行为请求行:GET / HTTP/1.1 ,主要包含用户请求的数据地址信息和http版本信息;
Host:
www.xxx.com.cn //为域名
Accept: text/html //可以接受的数据格式,(*/*表示任意格式)
user-agent: //对应用户使用的操作系统终端类型等信息;
connection: keep-live //相应完后是否断开连接,在http 1.0之前都是短连接,每一次请求等待相应结束后都会断开连接,在http1.1中默认情况下是长连接,是在第一次请求应答完后保持当前连接,如果后面再次请求会直接使用该链接;
应答数据中:
第一行为:状态行,包括http版本及服务器返回来的状态码:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
如上图:200 ok表示客户端请求成功;
Content-type表示服务器响应传回来的数据类型,如text/html;
Content-encoding表示数据正文中编码(压缩方式);
Content-length表示数据实体正文的长度,有时候无法计算正文长度,所以无法写入content-length字段,而是transfor-encoding:chunked,这种情况主要出现在请求动态页面,动态页面的数据长度无法确定情况,目前出现比较多的是和Content-encoding:gzip这种方式一起的情况,因为gzip压缩后如果要计算他的长度,需要将其存到一个大的数组中然后计算其数据长度,但使用chunked编码,会直接将进行分块传输,即缓存区满后就传输给客户端,编码使用若干chunk块组成,由一个长度为0的chunk结束,每个chunk有两部分组成,第一部分是该chunk的长度和长度单位,第二部分为指定长度的内容,每个部分用CRLF隔开,最后一个长度为0的chunk中的内容成为footer内容;
Server表示使用什么服务器,如Apache或者微软的IIS;