优点: 1. 协议选用灵活 2. 可以缓存数据
缺点: 1. 对用户安全构成威胁 2. 开发工作量大, 调试困难(桌面客户端非常繁琐,涉及到多线程以及数据同步)
优点: 跨平台,开发工作量减小
缺点: 只能使用http
https就是经过加密的
Http协议分为请求和响应
其实12306就是把浏览器封了起来(一种框架),但是效率低,损耗大,硬件要求高
OSI(开放系统互联)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范,把网络从逻辑上分为了7层,每一层都有相关、相对应的物理设备,比如路由器,交换机。OSI七层模型是一种框架性的设计方法,其最主要的功能就是帮助不同类型的主机实现数据传输。他的最大优点是将服务、接口和协议这三个概念明确地区分开,概念清楚,理论也比较完整,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通信。
物 – 双绞线, 光纤
数 – 数据的传输和错误检测
网 – 为数据包选择路由(避免断掉的线路)
传 – 提供端对端的接口 tcp/udp
会 – 解除或建立与别的节点的联系
表 – 数据格式化,代码转换,数据加密
应 – 文件传输,电子邮件,文件服务,虚拟终端
物理层:负责光、电信号的传递方式,比如现在以太网通用的网线(双绞线),早期以太网采用的是同轴电缆(现在主要用于有线电视),光纤,现在的wifi无线网使用电磁波等都数据物理层的概念,物理层的能力决定了最大传输速率、传输距离,抗干扰性,集线器工作在物理层
数据链路层:负责设备之间的数据帧的传送和识别,例如网卡设备的驱动、帧同步、冲突检测、数据差错校验等工作,有以太网、令牌环网、无限LAN等标准。交换机工作在数据链路层
网络层:负责地址管理和路由选择,例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划处两台主机之间的数据传输的线路(路由)。路由器工作在网络层
传输层:负责两台主机之间的数据传输,如TCP协议能够确保数据可靠的从源主机发送到目标主机
应用层:负责应用程序间的沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问(Telnet)等。
以上因为我们对于物理层的考虑较少,因此很多时候可以称为TCP/IP四层模型
1) 不同的协议层对数据包有不同的称谓,在传输层叫做段,在网络层叫做数据报,在链路层称作帧。
2) 应用层数据通过协议栈发送到网络上时,每层协议都要加上一个数据首部,称为封装
3) 首部信息中包含了一些类似于首部有多长,载荷有多长,上层协议是什么等信息
4) 数据封装成帧发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的“上层协议字段”将数据交给对应的上层协议处理
1)IP地址是在IP协议中,用来标识网络中的不同主机的地址,对于IP地址来说是一个4字节,32位的整数
2)我们通常使用点分十进制的字符串来表示一个IP地址
1) MAC地址用来识别数据链路层中相连的节点
2) 长度为48位(6个字节),一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
3) 在网卡出厂时就确定了,不能修改,mac地址通常是唯一的(虚拟机中的mac地址不是真正的mac地址,可能会冲突,也有网卡支持用户配置mac地址)
IANA端口的划分
1) 众所周知的端口(0-1023),使用这些端口需要是超级用户
2) 已登记的端口(1024-49151)
3) 动态或私有端口(临时端口)(49152-65535),我们写的程序应该使用这些端口
netstat是一个用来查看网络状态的重要工具
语法:netstat [选项]
功能:查看网络状态
常用选项:
-n 拒绝显示别名
-l 仅列出有在监听的服务状态
-p 显示建立相关连接的程序名
-t 仅显示TCP相关选项
-u 仅显示UDP相关选项
-a 显示所有选项,默认不显示LISTEN相关
在查看服务器的进程ID时非常方便
语法:pidof[进程名]
功能:通过进程名,查看进程ID
1) 可靠地实现TCP全双工连接的终止
2) 允许老的重复分节在网络中消逝
UDP协议首部有一个16位的最大长度,也就是说一个UDP能够传输数据的最大长度是64K(包含UDP数据报首部)
传输层
负责数据能够从发送端传输到接收端
端口号标识了一个主机上进行通信的不同应用程序。
三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上三次握手就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。
刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。
第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN x。此时客户端处于 SYN_SEND 状态。
首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。
第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。
在确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y。
ACK 中的确认序号是发送这个ACK的一端所期待的下一个序列号,因为SYN占据一个字节的序列号空间,所以每一个SYN的ACK中的确认序号就是该SYN的初始序号加一(每个FIN的ACK中的确认序号为该FIN的序列号加一)
第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。
确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。
发送第一个SYN的一端将执行主动打开(active open),接收这个SYN并发回下一个SYN的另一端执行被动打开(passive open)。
在socket编程中,客户端执行connect()时,将触发三次握手。
建立一个连接需要三次握手,而终止一个连接要经过四次挥手(也有将四次挥手叫做四次握手的)。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。
TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务器均可主动发起挥手动作。
刚开始双方都处于 ESTABLISHED 状态,假如是客户端先发起关闭请求。四次挥手的过程如下:
第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。
即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。
第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。
即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。
第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。
第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。