目录
TCP/IP
socket
一、socket()套接字有哪些?
socket通信流程
四、如果你访问一个网站很慢,怎么排查和解决?
TCP/IP
要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何在它们之间传输的标准。
从字面意思来看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
我们知道两个进程如果需要进行通讯最基本的一个前提能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
一、socket()套接字有哪些?
套接字(socket)是网络中不同主机上的应用进程进行双向通信的端口的抽象,网络进程通信的一端就是一个套接字,不同主机上的进程就是通过套接字发送数据报来进行通信的,如TCP协议使用主机的IP地址+端口号来作为TCP连接的端点,这个端点就是套接字。
套接字主要有以下三种类型:
-
流套接字(SOCK_STREAM): 流套接字基于TCP传输协议, 主要用于面向连接的、可靠的数据传输服务,由于TCP协议的特点,使用流套接字进行通信时能够保证数据无差错、无重复传送、并按顺序接收,通信双方不需要在程序中进行相应的处理。
-
数据报套接字(SOCK_DGRAM): 因为UDP协议传输的是数据报,所以数据报套接字是基于UDP传输协议的,对应于无连接的UDP服务应用,该服务并不能保证数据传输的可靠性, 也无法保证数据按照顺序到达, 同时通信两端不需要建立长时间的连接,UDP客户端发送一个数据给服务器后,就可以使用同一个套接字给另一个服务器发送数据, 当使用UDP套接字时,丢包等问题需要在程序中进行处理。
-
原始套接字(SOCK_RAW): 由于流套接字和数据报套接字只能抓取TCP和UDP协议的数据,当需要处理非传输层数据包或操作系统无法处理的数据包时,就需要使用原始套接字来发送。
socket通信流程
简单描述一下Socket的通信流程:
- 服务端这边首先创建一个Socket(Socket()),然后绑定IP地址和端口号(Bind()),之后注册监听(Listen()),这样服务端就可以监听客户端的连接请求了;
- 客户端这边也创建一个Socket(Socket())并打开,然后根据服务器IP地址和端口号向服务器Socket发送连接请求(Connect());
- 服务器Socket监听到客户端Socket发来的连接请求之后,被动打开,并调用Accept()函数接收请求(开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端连接请求);
- 客户端连接成功,向服务器发送连接状态信息;
- 服务器accept方法返回,连接成功;
- 成功建立连接之后就可以互相传送数据了,客户端和服务器进行数据交互(Receive()、Send());
- 在数据传送完成之后,各自关闭连接(Close()),交互结束;
服务器socket与客户端socket建立连接的部分其实就是大名鼎鼎的三次握手
四、如果你访问一个网站很慢,怎么排查和解决?
网站打开慢的原因有很多,总结一下最常见的几个。
-
查看本地网络是否正常,查看网络带宽是否被占用,如有其他进程正在占用本地网络带宽。
-
若网络连接正常,那么就应该对该网站的服务器速度进行排查,通过ping命令查看连接到服务器的时间和丢包情况,如果服务器正常,那么丢包率一般不会超过1%, 其次是ping值要小,最后是ping值要稳定,如果ping值的最大和最小差值过大说明路由不稳定。 或者我们查看打开同台服务器上的其他网站的速度,看打开其他网站的速度是否也慢。
-
如果网站打开速度时快时慢,甚至有时候打不开的情况,那么有可能是空间不稳定,如果确定了是该问题,那么就应该找你的空间商更换空间了,可以选择购买双线或多线空间。
-
从网站本身寻找原因,网站的问题主要包括网站程序设计、网页结构设计和网页内容三部分。
1、网站程序设计: 当访问网页中有拖慢网站打开速度的代码,会直接影响网站的打开速度,如网页中使用的统计代码,一般是要放置在网站末尾的,防止其在加载过程中出现延迟。
2、网页结构设计: 查看网页布局的代码,如果网页使用的table布局的网页,查看是否被嵌套次数过多,或者是使用一个大表格分成多个小表格的布局,这个时候可以使用div配合css来改进。
3、网页内容: 查看网页中是否有许多大尺寸的图片和大尺寸的flash存在,我们可以通过降低图片质量,减少图片尺寸,少用过多的flash来解决。或者可能是由的网站引用了其他网站的内容, 若某些被引用的网站访问速度慢或者不存在,该网站的打开速度自然会变慢,所以可以直接减少不必要的加载项。