在讲网络编程之前,我们先在开头说一点网络编程的基础知识,比计网简略了不少,希望大家不要把这些知识直接代入到计网的考试中。
网络可分为七层/四层
七层从上到下分别是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
为了方便,其实也可以只抽象出四层,从上到下分别是:应用层、传输层、网络层、链路层。
应用层:解决了要传递什么数据(传数据的格式)。
传输层:解决如何传输数据(分为UDP和TCP),UDP协议:不保障数据的安全性。
网络层:IP协议(定位),可以理解为地理位置坐标。
链路层:具体的传输工具。
只要进行网络通信,传输层、网络层和链路层是一定会涉及到的,应用层不一定(如果不把传输的数据抽象出一个协议的话,就用不到应用层)。
下面我们开始讲一下简单的socket编程:
网络通信的两端分别是客户端和服务器,这篇文章的代码先不考虑应用层,只考虑传输层
下图是socket伪代码
首先是服务器端先创建一个socket
Socket = socket.socket(AF_INET,SOC_STREAM)
其中STREAM(流)指的是TCP协议,而UDP协议是DGRAM数据报(因为UDP发过去之后不会确认,也就是只有一次报文传输;而TCP发过去后,只要没断开连接,服务器还会返回数据确认收到的报文序号seq、ack等)。
接下来服务器端进行绑定,绑定一个地址和端口
Socket.bind()。
随后服务器端进行监听
Socket.listen()。
然后客户端进行创建与连接
So = socket.socket();So.connect()。
接下来是服务器端的接收
Socket.accept(),实际上是while True循环等待。
之后双方都可以进行消息的传送与接收
其中TCP是send()与recv()方法,UDP是sendto()与recvfrom()。
最后是四次挥手
也就是客户端的close()。
补充一点,代码中So.connect()与cli_so =
Socket.accept()进行的是著名的三次握手,也就是客户端先发一个报文seq,服务器接收后给客户端一个响应ack,客户端收到响应之后再给服务器一个响应,这些都是由操作系统内核完成的。
希望能对大家有所启发,作者@dger
,这些都是由操作系统内核完成的。
希望能对大家有所启发,作者@dger