网络编程是什么:
网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组包,
在接收端按规定好的协议把包进行解析,从而提取出相应的信息,达到通信的目的.
其中最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,
其中涉及到代码,数据库,网页设计,服务器架设,
c/s类与b/s类是目前主要的程序架构,
c/s是Client与Server即:
客户端与服务端架构,例如手机上的微信,支付宝,电脑上的qq,等都是需要先下载客户端
才能使用相应的功能.
b/s是Browser与Server,浏览器与服务器端架构,入常用的浏览器提供的服务,例如百度,各类
与目前兴起的各类小程序
网络模型:
按照分工不同:
常见的有osi 七层模型
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
注: 在5层模型中 应用层与表示层,会话层可合并为应用层,
事实上人来使用计算机进行通信往往是要进行程序与程序之间的信息交互,
而这就需要用到ip与端口 以此在互联网中成千上万的电脑中找到目标电脑中
的目标程序.
ip地址:
目前主流的有老版本的ipv4协议
其取值范围为0,0,0,0 只255,255,255,255 可以归纳为点分十进制
但随着科技的发展,很明显ipv4提供的总ip地址渐渐不能满足日益庞大的互联网用户数量的需求,
而退出了ipv6协议,正在逐渐普及中.
TCP 与 UDP
TCP:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、
基于字节流的传输层通信协议,由IETF的RFC 793 定义。
TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端点之间
提供一条具有下列特点的通信方式:
(1)基于流的方式;
(2)面向连接;
(3)可靠通信方式;
(4)在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;
(5)通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。
为满足TCP协议的这些特点,TCP协议做了如下的规定:
①数据分片:在发送端对用户数据进行分片,在接收端进行重组,由TCP确定分片的大小并控制分片和重组;
②到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认;
③超时重发:发送方在发送分片时启动超时定时器,如果在定时器超时之后没有收到相应的确认,重发分片;
④滑动窗口:TCP连接每一方的接收缓冲空间大小都固定,接收端只允许另一端发送接收端缓冲区所能接纳的数据,
TCP在滑动窗口的基础上提供流量控制,防止较快主机致使较慢主机的缓冲区溢出;
⑤失序处理:作为IP数据报来传输的TCP分片到达时可能会失序,TCP将对收到的数据进行重新排序,
将收到的数据以正确的顺序交给应用层;
⑥重复处理:作为IP数据报来传输的TCP分片会发生重复,TCP的接收端必须丢弃重复的数据;
⑦数据校验:TCP将保持它首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。
如果收到分片的检验和有差错,TCP将丢弃这个分片,并不确认收到此报文段导致对端超时并重发。
其中最著名的是其3次握手建链接,4次挥手断链接.
而TCP的稳定性并不来源于其双向通道,而是来自于TCP消息反馈机制,即:不论是接收还是发送消息都要得到目标的回应后,
才终止当前工作,而不是发送数据后不管不顾.
五,套接字socket
传输层实现端到端的通信,因此,每一个传输层连接有两个端点。那么,传输层连接的端点是什么呢?
不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。传输层连接的端点叫做套接字(socket)。
根据RFC793的定义:端口号拼接到IP地址就构成了套接字。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,
包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端口号)。
例如,如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。实质:一种独立于协议的网络编程接口.
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。
套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
为了满足不同的通信程序对通信质量和性能的要求,
一般的网络系统提供了三种不同类型的套接字,以供用户在设计网络应用程序时根据不同的要求来选择。
这三种套接为流式套接字(SOCK-STREAM)、数据报套接字(SOCK-DGRAM)和原始套接字(SOCK-RAW)。
(1)流式套接字。它提供了一种可靠的、面向连接的双向数据传输服务,实现了数据无差错、无重复的发送。流式套接字内设流量控制,
被传输的数据看作是无记录边界的字节流。在TCP/IP协议簇中,使用TCP协议来实现字节流的传输,当用户想要发送大批量的数据或者对
数据传输有较高的要求时,可以使用流式套接字。
(2)数据报套接字。它提供了一种无连接、不可靠的双向数据传输服务。数据包以独立的形式被发送,并且保留了记录边界,
不提供可靠性保证。数据在传输过程中可能会丢失或重复,并且不能保证在接收端按发送顺序接收数据。在TCP/IP协议簇中,
使用UDP协议来实现数据报套接字。在出现差错的可能性较小或允许部分传输出错的应用场合,可以使用数据报套接字进行数据传输,这样通信的效率较高。
(3)原始套接字。该套接字允许对较低层协议(如IP或ICMP)进行直接访问,常用于网络协议分析,检验新的网络协议实现,也可用于测试新配置或安装的网络设备。
在python中我们使用socket模块:
socket():创建套接字。
bind():指定本地地址。一个套接字用socket()创建后,它其实还没有与任何特定的本地或目的地址相关联。在很多情况下,应用程序并不关心它们使用的本地地址,
这时就可以不用调用bind指定本地的地址,而由协议软件为它们选择一个。但是,在某个知名端口(Well-known Port)上操作的服务器进程必须要对系统指定本地端口。
所以一旦创建了一个套接字,服务器就必须使用bind()系统调用为套接字建立一个本地地址。
connect():将套接字连接到目的地址。初始创建的套接字并未与任何外地目的地址关联。客户机可以调用connect()为套接字绑定一个永久的目的地址,将它置于已连接状态。
对数据流方式的套接字,必须在传输数据前,调用connect()构造一个与目的地的TCP连接,并在不能构造连接时返回一个差错代码。如果是数据报方式,则不是必须在传输数据前调用connect。
如果调用了connect(),也并不像数据流方式那样发送请求建连的报文,而是只在本地存储目的地址,以后该socket上发送的所有数据都送往这个地址,程序员就可以免去为每一次发送数据都指定目的地址的麻烦。
listen():设置等待连接状态。对于一个服务器的程序,当申请到套接字,并调用bind()与本地地址绑定后,就应该等待某个客户机的程序来要求连接。listen()就是把一个套接字设置为这种状态的函数。
accept():接受连接请求。服务器进程使用系统调用socket,bind和listen创建一个套接字,将它绑定到知名的端口,并指定连接请求的队列长度。然后,服务器调用accept进入等待状态,直到到达一个连接请求。
send()/recv()和sendto()/recvfrom():发送和接收数据 。在数据流方式中,一个连接建立以后,或者在数据报方式下,调用了connect()进行了套接字与目的地址的绑定后,就可以调用send()和reev()函数进行数据传输。
closesocket():关闭套接字。
代码示例:
UDP:
(稍后再补)
原文:https://www.cnblogs.com/Sunbreaker/p/11318288.html