(1)如果一台计算机只有一个网卡,并且接入了网络,那么,它有一个本机地址127.0.0.1,还有一个IP地址,例如101.202.99.12,可以通过这个IP地址接入网络。
如果一台计算机有两块网卡,那么除了本机地址,它可以有两个IP地址,可以分别接入两个网络。通常连接两个网络的设备是路由器或者交换机,它至少有两个IP地址,分别接入不同的网络,让网络之间连接起来。
(2)每台计算机都需要正确配置ip地址和子网掩码,根绝这两个就可以计算网络号,如果两台计算机计算出的网络号相同,说明两台计算机在同一个网络上,可以直接通信。如果不同,那么两台计算机不在同一个网络,不能直接通信,他们之间必须通过路由器或者交换机这样的网络设备间接通信,我们把这种设备称为网关。
(3)网关的作用就是链接多个网络,负责把来自一个网络的数据包发送到另一个网络,这个过程就叫作路由。
(4)因为直接记忆IP地址非常困难,所以我们通常使用域名访问某个特定的服务。域名解析服务器DNS负责把域名翻译成对应的IP,客户端再根据IP地址访问服务器。有一个特殊的本机域名localhost,它对应的IP地址总是本机地址127.0.0.1。
(5)网络模型:
(1)ip协议是一个分组交换协议,它不保证可靠传输。而TCP协议是传输控制协议,他是面向链接的协议,支持可靠传输和双向通信。TCP协议是建立在IP协议之上的,简单地说,IP协议只负责发送数据包,不保证顺序和正确性,而TCP协议负责控制数据包传输,它在传输数据之前需要先建立连接,建立连接后才能传输数据,传输完成后还需要断开连接。TCP协议之所以能够保证数据的可靠传输,是通过接收确认、超时重传这些机制实现的,而且,tcp协议云讯双向通信,即通信双方可以同时发送和接收数据。
(2)TCP协议也是应用最广泛的协议,许多高级协议都是建立在TCP协议之上的,例如HTTP/SMTP等。
(3)UDP协议是以中国魂数据报文协议,他是无连接协议,不保证可靠传输。因为UDP协议在通信钱不需要建立连接,因此它的传输效率比TCP高,而且UDP协议比TCP协议要简单的多。选择UDP协议时,传输的数据通常是能容忍丢失的,例如一些语音视频的应用会选择UDP协议。
(1)Socket是一个抽象概念,一个应用程序通过一个Scoket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据传输到网络层。Socket、TCP和部分IP的功能都是由操作系统提供的,不同的编程语言只是提供了对操作系统调用的简单的封装。例如,Java提供的结果Socket相关的类就封装了操作系统提供的接口。
(2)为什么需要Scoket进行网络通信,因为仅仅通过IP地址进行通信是不够的,同一台计算机同一时间会运行多个网络应用程序,例如浏览器、QQ、邮件客户端等。当操作系统接收到一个数据包的时候,只有IP地址,它无法判断发给哪个应用程序,所以操作系统抽象出Socket接口,每个应用程序需要对应到不同的Socket,数据包才能根据Socket正确地发送到对应的应用程序。
(3)使用Socket进行网络编程时,本质上就是两个进程之间的网络通信,其中一个进程必须充当服务器端,他会主动监听某个指定的端口,另一个进程必须充当客户端,它会必须主动连接服务器的IP地址和指定端口,如果连接成功,服务端和客户端就成功建立了一个TCP连接,双方后续就可以随时发送和接收数据。因此,当Socket连接成功地在服务器端和客户端之间建立连接后:
对服务器端来说,它的Socket是指定的IP地址和指定的端口号;
对客户端来说,它的Socket是指它所在计算机的IP地址和一个由操作系统分配的随机端口号。
(4)当Socket连接创建成功后,无论是服务器端还是客户端,我么那都是用Socket进行网络通信。因为TCP是一种基于流的协议,因此,Java标准库使用InputStream和OutPutStream来封装Socket的数据流,这样我们使用Socket的流,和普通的IO流相似。
(5)如果不调用flush()方法,我们很可能会发现,客户单和服务器都收不到数据,这并不是Java标准库的设计问题,而是我们以流的形式写入数据的时候,并不是一写入就立刻发送到网络,而是先写入内存缓冲区,知道缓冲区满了以后,才会一次性发送到网络,这样设计的目的是为了提高传输效率。如果缓冲区的数据很少,而我们又想要把这些数据发送到网络,就必须调用flush()强制把缓冲区数据发送出去。
(1)HTTP可翻译为超文本传输协议,它是基于TCP协议上的一种请求-响应协议。
(2)HTTP请求的格式是固定的,它由HTTP Header和HTTP Body两部分构成,第一行总是请求方法、路径、HTTP版本。后续的每一行都是固定的Header:value格式,我们称为HTTP Header,服务器依靠某些特定的Header来是被客户端请求,例如:
Host:表示请求的域名,因为一台服务器上可能有多个网站,因此有必要依靠Host来识别是发送给哪个网站的;
User-Agent:表示客户端自身标识信息,不同的浏览器有不同的标识,服务器依靠User-Agent判断客户端类型时IE还是Chrome,是Firefox还是Python爬虫;
Accept:表示客户端能处理的HTTP响应格式,*/*表示任意格式,text/*表示任意文本,image/png表示PNG格式的图片。
Accept-Langauge:表示客户单接收的语言,多种语言按优先级排序,服务器依靠该字段给用户返回特定的语言的网页版本。
(3)如果是GET请求,那么该HTTP请求只有HTTP Header,没有HTTP Body。如果是POST请求,那么该HTTP请求带有Body,以一个空行分隔。
(4)此外,GET请求的参数必须附加在URL上,并以URLEncode方式编码,例如:http://www.example.com/?a=1&b=K%26R,参数分别是a=1和b=K&R。因为URL的长度限制,GET请求的参数不能太多,而POST请求的参数就没有长度限制,因为POST请求的参数必须放到Body中。并且,POST请求的参数不一定是URL编码,可以按任意格式编码,只需要在Content-Type中正确设置即可。