一、架构
两种常见的架构:C/S架构(客户机/服务器)和B/S架构(浏览器/服务器,也属于C/S架构的一种)。
C/S架构优点:
- 能充分发挥客户机的性能
- 由于只有一层交互,因此响应速度较快,安全性高
C/S架构缺点:
- 用户群固定,需要下载客户端才能使用
- 维护成本高
B/S架构优点:
- 客户端无需安装,有浏览器就行,跨平台
- B/S架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强
- 统一了应用的接口
B/S架构缺点:
- 跨浏览器问题
- 在速度和安全性上需要花费巨大的设计成本
二、通信
网络编程基本上都是基于请求/响应方式的,即一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。
MAC地址:物理地址,由网卡决定的,是固定且唯一的。在OSI模型中第二层数据链路层负责。
IP地址:四位点分十进制,在计算机内部存储时只需要4个字节即可。在OSI模型中第三层网络层负责。标识了计算机在网络中的位置。可以使用IP或域名来标识网络上的一台设备。
域名:由于IP地址不方便记忆,给IP取一个字符的名字,IP和域名之间存在一定的对应关系。在网络中只能使用IP地址进行数据传输,所以在传输以前,需要把域名转换为IP,这个由DNS的服务器完成。
端口:规定一个设备有216个,即65536个端口,每个端口对应一个唯一的程序。每个网络程序,无论是客户端还是服务器端,都对应一个或多个特定的端口号。由于0-1024之间多被操作系统占用,所以实际编程时一般采用1024以后的端口号。使用端口号,可以找到一台设备上唯一的一个程序。
如果需要和某台计算机建立连接的话,只需要知道IP地址或域名即可,但是如果想和该台计算机上的某个程序交换数据的话,还必须知道该程序使用的端口号。
环回地址:网络ID为127的IP地址,用于一台主机的客户端与服务器端通过TCP/IP进行通信或者本机进程间通信,127.0.0.1。
交换机:是一种在通信系统中完成信息交换功能的设备。
- 交换机的通信方式:广播、单播、组播
- 交换机的传输模式:全双工,半双工,全双工/半双工自适应
利用交换机的通信:源主机发送一个请求帧给交换机,其中包含自身ip地址、mac地址,目标ip地址;交换机广播这条消息给其他所有的主机;目标主机接收到消息后,比对ip,回复给交换机信息,其中包含自身ip地址、mac地址,目标ip地址、mac地址;交换机以单播形式返回给源主机。
路由器:连接不同网段。路由则是通过互联的网络把信息从源地址传输到目的地址的活动。路由发生在OSI网络参考模型中的第三层即网络层。
网关:一个网络连接到另一个网络的“关口”。要实现这两个网络之间的通信,则必须通过网关。类似于一个局域网的出口和入口。
网段:一个局域网内的ip地址范围。
子网掩码:指明一个ip地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码和ip地址进行与运算&得到网段。
arp协议 : 通过目标ip地址获取目标mac地址的一个协议。
OSI模型:
应用层(应用层、表示层、会话层) | http协议、https协议、ftp协议 | |
传输层 | tcp协议、udp协议 | 四层交换机、四层路由器 |
网络层 | ip协议 | 路由器、三层交换机 |
数据链路层 | arp协议 | 网卡、网桥、以太网交换机 |
物理层 | 集线器、网线、光纤 |
TCP/IP三次握手与四次挥手
ACK:确认收到
SYN:请求连接的一个标识
FIN:请求断开的一个标识
三次握手:
所谓“三次握手”就是TCP连接建立的过程,即需要客户端与服务端总共发送三个包(所以着重记忆这三个包就可以了)以确认连接的建立。
通过“三次握手”保证了客户端与服务器建立的是双工连接,而可靠性是更多是通过重发机制实现的。
在Socket编程中,这一过程由客户端执行connect来触发。
过程:首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源,将客户端加入等待链接队列。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。
白话:一定是由客户端发起请求连接服务器;服务器回复接收到的请求,并要求连接客户端;客户端回复可以连接
四次挥手:
所谓“四次挥手”就是关闭TCP连接的过程,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认双方连接的断开。
同样是保证TCP连接的全双工连接。
在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
过程:假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。TCP连接就这样关闭了!
白话:任意一方发起断开连接的请求:我想和你断开连接,我没有数据要继续发送了,但如果你有数据需要发送,我可以继续接收;服务器回复:我接收到你的请求了;服务器发送:我已经准备好断开连接了;客户端回复:收到你的信息,断开连接。
注意:当客户端进入time-wait后,如果2MSL时间内不在收到服务器端的fin报文,说明服务器端已经收到客户端的ACK应答报文,客户端socket进入closed状态。但是因为网络原因服务器未收到ACK,那么服务器会认为之前发送的的FIN,客户端没有收到,则会继续发送FIN报文,直到收到来自客户端的ACK报文。
问题:为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
问题:交换机和路由器的区别?
答:交换机的主要功能是组织局域网,经过交换机内部处理解析信息之后,将信息以点对点,点多对的形式,发送给固定端;路由器的主要功能:是进行跨网段进行数据传输,路由选择最佳路径。