socket传输过程简单分解:
socket是网络编程接口,何为接口,任何两个物体,如果它们向通信交流就必须有接口,通过接口才能互相的传递数据信息,但是数据信息的传递,又必须遵循标准协议,比如你写一段中文的信发给一个美国老看,what a piece shit.于是又有了数据的协议必须用什么组织方式,是json,xml还是二进制块等等,分布在世界各地的主机要想相互的通信,就是通过socket来实现,socket又是操作系统平台给我们封装好的函数接口,通过这些函数接口我们就可以通过参数设置来实现我们想要的通信。
socket是基于TCP/IP网络通信协议实现的,TCP/IP网络通信协议就是一些数据包的信息标识,通过这些标识可以把消息送到目的主机。
协议就是标准,大家公认的标准,通过这些标准大家去实现,这样大家的信息才能相互的解析,如果MAC有自己的网络通信协议,Windows有自己的网络通信协议,Linux有自己的网络通信协议,那么Mac发给windows的消息,windows将无法解析,如果大家遵循都坐下来商量我们就定义一个大家认为都好的网络通信协议,这样各个平台的消息才能正确的解析。TCP/IP网络通信协议就是这几个平台支持实现的标准,这样各个平台之间就能相互解析网络数据。
协议又分为二进制协议,和字符串协议,二进制就是通过二进制为来标识信息的种类长度等,TCP/IP就是二进制协议,而字符串协议就是通过键值对的形式进行消息的标识,如http restful请求,通过请求参数和值来说明想要请求的服务器资源。
网络发送数据的大体思想是,想要发送的数据通过socket send发送,socket是基于TCP/IP协议,发送的数据每通过一个协议栈就会被那个协议栈处理,如加上协议头信息,数据太大了进行切割,然后交个下一个协议,最后交给硬件缓存去,硬件层转换为传输信号,如电型号,声波信号,光信号等进行传输,
接受到的一方就经过反向过程对数据进行解析,因为都遵循同一个标准,所以对方知道对方怎么打包数据,所以它就知道怎么解析数据。解析得到数据交给应用层使用。
协议栈的工作互不干扰,一层服务一层,一层为另一层工作,每一层的工作都是对上一层的数据加上该层的协议信息传递给下一层,或者去掉给协议的协议信息,交给上一层解析。
socket要想通信必须有这几方面的确定因素,要不然找不到目的地。
一个计算机可能有多个的应用程序,如果每个应用程序都有一个socket(有的有多个),当操作系统接受到来自网络的数据,它将不知道应该把数据交给那个应用程序的那个socket,所以socket在操作系统中的标识就是通过端口号来标识的,每个端口号标识一个socket,所以每个socket必须绑定一个没有被使用的端口号,当操作系统接受到网络数据,它就通过对应的端口号找到对应的socket,从而将数据交给应用层处理。
发送的数据只知道端口号,还是不能传输,它还要计算机的逻辑地址IP,通过对应的IP找到对应的主机,因为一个局域网中可能有很多个计算机,每个计算机被分配的IP不一样,当改局域网接受到从外网的数据,就是通过IP找到对应的目的主机。每个主机又有硬件Mac地址。你要发送给谁了,于是就要指定对方的IP和端口号
数据,端口,IP,Mac,目的地址的IP和端口号。这就构成了传输数据的基本条件了。
note:真正的实现没有这么简单的,这里主要是把它的过程进行简单的分解从而了解网络编程的思想,要想真正的写出好的网络通信框架需要不断的积累。想要知道理论上的网络通信可以通过《TCP/IP详解的原理》《TCP/IP的实现》进行了解。
TCP/IP协议栈(网络资源)
协议栈说明:
应用层:
Telnet,FTP,SMTP,DNS,HTTP都是在应用成比较常用的应用程序,有的可以用来获取对应IP的域名,进行网络诊断,邮件传输,浏览器的HTTP请求的。
传输层:
TCP UDP的主要区别是可靠传输和不可靠传输,数据包形式和数据流的形式传输
网络层:
IP,ARP,PARP,ICMP,就属于协议的劳动者了,这些协议的主要工作就是对网络状态的控制协议,检测网络环境是否通,发送的数据包是否发送完成,目的地址是否可达,发送状态,发送超时检测等等。
网络层:
各种通信网络接口,它决定信息的传输方式和形式。
数据的传输本质上就是加上协议头和信息通过物理层转换成传输介质进行传输。解析就是通过去掉底层的协议信息逐渐的交个上一层,直到应用层。
socket的传输图解:(真正过程没这么简单)