粗读《网络是怎么连接的》第一章,描述了从应用程序,解析URL到委托给操作系统的大致过程,解析URL,生成HTTPmessagetotheDNSserver获取web服务器IPglobalDNSserverrelay委托协议栈发送消息,这涉及到很多概念:URLHTTPDNSSocket协议栈。URLURL:统一资源定位符(URL),用于定位和访问互联网上的资源。URL规范来自万维网全球信息倡议组织(WorldWideWebGlobalInformationInitiative)。URL是URI的子集,遵循URI的语法规范。URI仍然由US-ASCII的一个子集组成,大致可以分为保留字符、非保留字符和转义字符。1.URI的主要组成部分使用US-ASCIIfoo://example.com:8042/over/there?name=ferret#nose\_/\__________/\_________/\_________/\__/||||scheme权限路径查询片段|____________________|__/\/\urn:example:animal:ferret:nosescheme:urlschemename,eg:httpftpeg:https://www.w3.org/schemename由以下字符组成:字母(a~z)数字+。-不区分大小写。2.URI的语法规范见https://www.rfc-editor.org/rf...2005年和2002年出版的HTTP权威指南应该参考https://www。rfc-editor.org/rf...2.1保留字符--类似于java关键字reserved=gen-delims/sub-delimsgen-delims=":"/"/"/"?"/"#"/"["/"]"/"@"sub-delims="!"/"$"/"&"/"'"/"("/")"/"*"/"+"/","/";"/"="gen-delimsdelimiter用于分隔URI组件sub-delimsdelimiterinsidecomponents2.2非保留字符可以直接在url中使用unreserved=ALPHA/DIGIT/"-"/"."/"_"/"~"忽略大小写2.3转义字符使用java.net.URLEncoder试试System.out.println(URLEncoder.encode("1aA-._~:/?#[]@!$&'()*+,;=","UTF-8"));1aA-._%7E%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29*%2B字符除了%2C%3B%3DALPHA/DIGIT/"-"/"."/“_”需要转义。公式URI字符序列->八位字节序列->原始字符序列URI字符序列->八位字节序列(US-ASCII)->原始序列%E4%BD%A0%E5%A5%BD-->e4bda0e5a5bd-->你好octet:8bit,2^8=256,两个十六进制相乘,在URL中表示为%HEXHEX早期的Byte并不一定代表8bit。在rfc协议中,用octet来表示8bit比较准确。“a”代表八位字节97(decimal)%0a表示octet10(十进制)一个字符对应三组(octet)一般为UTF-8Unicode/UTF-8-charactertable国标|GB18030-2005(samr.gov.cn)3.具体方案(scheme)使用BNF语法定义ftp文件传输协议http超文本传输??协议文件主机特定文件名telnet交互会话参考...3.1通用互联网方案语法//
