自己整理,方便平时常看。不喜勿喷
TCP/IP
从字面意思来看TCP/IP
是TCP
和IP
协议的合称,但实际上TCP/IP
协议是指因特网整个TCP/IP
协议族。不同于ISO
模型的七个分层,TCP/IP
协议参考模型把所有的TCP/IP
系列协议归类到四个抽象层中.
应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
传输层:TCP,UDP
网络层:IP,ICMP,OSPF,EIGRP,IGMP
数据链路层:SLIP,CSLIP,PPP,MTU
Socket概念
socket(套接字)
是通信的基石,是支持TCP/IP
协议的网络通信的基本操作单元,包含进行网络通信必须的五种信息:
- 连接使用的协议
- 本地主机的IP地址
- 本地进程的协议端口,
- 远地主机的IP地址,
- 远地进程的协议端口。
总的来说就是通信协议,协议端口,IP地址三个大的部分。
建立Socket
连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。套接字之间的连接过程分为三个步骤:
- 1.服务器监听
- 2.客户端请求
- 3.连接确认。
Socket
可以支持不同的传输层协议(TCP
或UDP
),当使用TCP
协议进行连接时,该Socket
连接就是一个TCP
连接,UDP
连接同理。
在本地进程通讯中我们可以使用PID
来唯一标示一个进程,但PID
只在本地唯一,网络中的两个进程PID
冲突几率很大,这时候我们需要另辟它径了,我们知道IP
层的ip
地址可以唯一标示主机,而`TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
socket
起源于UNIX
,在Unix
一切皆文件哲学的思想下,socket
是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
通信流程
socket
是"打开—读/写—关闭"模式的实现,以使用TCP协议通讯的socket为例,其交互流程大概是这样子的:
1、服务端
- 1.服务器根据地址类型
(ipv4,ipv6
)、socket
类型、协议创建socket
- 2.服务器为
socket
绑定ip
地址和端口号 - 3.服务器
socket
监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket
并没有被打开.
2、客户端(开始三次握手)
- 1、客户端创建socket
- 2、客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket。
3、服务端
- 1、服务器
socket
接收到客户端socket
请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket
进入阻塞状态,所谓阻塞即accept()
方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求
4、客户端
- 1、客户端连接成功,向服务器发送连接状态信息
5、服务器(三次握手完成)
- 1、服务器accept方法返回,连接成功
6、客户端
- 1、客户端向socket写入信息
7、服务器
- 1、服务器读取信息
8、客户端
- 1、客户端关闭
9、服务器端
- 1、服务器端关闭
三次握手
三次握手是为了确认客户端跟服务器都能接受到对方的信息。
第一次握手:客户端给服务器发包。此时服务器确认自己可以接收客户端的包, 客户端不确认服务器是否接收到了自己发的包。客户端不知道
第二次握手,服务器端回复客户端。 此时客户端确认自己发的包被服务器收到,也确认自己可以正常接收服务器包,客户端对此次通信没有疑问了。服务器可以确认自己能接收到客户端的包,但不能确认客户端能否接收自己发的包。服务端不知道
第三次握手,客户端回复服务器。 客户端已经没有疑问了,服务器也确认刚刚客户端收到了自己的包。两边都没有问题,开始通信。两边都知道。
形象比喻:
三次握手:
“喂,你听得到吗?”
“我听得到呀,你听得到我吗?”
“我能听到你,今天balabala……”
两次握手:
“喂,你听得到吗?”
“我听得到呀”
“喂喂,你听得到吗?”
“草,我听得到呀!!!!”
“你TM能不能听到我讲话啊!!喂!”
“……”
四次握手:
“喂,你听得到吗?”
“我听得到呀,你听得到我吗?”
“我能听到你,你能听到我吗?”
“……不想跟傻逼说话”
再看一个解释:
因为保证“ A说话B听得到, B说话A也听得到”这件事 并让双方都知道,刚好至少需要三次shake hands.
如果只让一方确定这件事就够了,那两次握手足矣。
比如A发送"你听得到我吗";
B收到并回复"我听得到,你听得到我吗?";
A收到这句话;(此时A已经能确定他们两个说话对方都听得到,但是B并不知道。)
所以A需要再回复一次:"我也听得到"。
B收到后,此时A,B都确定了『我说话你听得到,你说话我也听得到』这件事。
...
正式解释
第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入SYN_SEND状态等待服务器确认
第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
定睛一看,服务器socket与客户端socket建立连接的部分其实就是大名鼎鼎的三次握手
四次和三次
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP
连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP
连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”。
TCP连接的拆除
TCP连接的拆除需要发送四个包,因此称为四次握手(four-way handshake)。在socket编程中,任何一方执行close()操作即可产生握手(有地方称为“挥手”)操作。
之所以有“三次握手”和“四次握手”的区别,是因为连接时当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。
但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
Http
HTTP
协议即超文本传送协议(HypertextTransfer Protocol
),是Web
联网的基础,也是手机联网常用的协议之一,HTTP
协议是建立在TCP
协议之上的一种应用。
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,是HTTP的安全版。 在HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息。
https协议需要到ca申请证书;http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议;http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443;http的连接很简单,是无状态的,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。
Socket连接与HTTP连接的不同
通常情况下Socket
连接就是TCP
连接,因此Socket
连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际应用中,客户端到服务器之间的通信防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。
而HTTP
连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
之间的区别
- HTTP协议:简单对象访问协议,对应于应用层 ,HTTP协议是基于TCP连接的
- TCP协议: 对应于传输层
- IP协议: 对应于网络层
TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。
- Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
- Http连接:http连接就是所谓的短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断掉。
- Socket连接:socket连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该连接以释放网络资源。所以当一个
socket
连接中没有数据的传输,那么为了维持连接需要发送心跳消息~~具体心跳消息格式是开发者自己定义的。