一、预备知识
对于我们,主要掌握5层协议就行。
物理层:
转成二进制数序列
数据链路层:
形成统一的协议:Internet协议
包括数据头(18个字节,前6个字节原地址,中间6个字节为目标地址,后6个字节为数据的描述)和数据
网络层:
有IP协议,包括IP头和数据
传输层:
包括tcp、UDP两个协议:基于端口(0-65535)的协议
应用层:
包括http、ftp协议
TCP协议:流式协议,先把管道修好
客户端 服务端
C-------------------------------->S
发包:
C请求,S同意后并我也要挖隧道,C才可以挖隧道到S。(三次握手)
结束发包:
C请求,S确认,S请求,C确认(四次挥手)
UDP协议:传输不可靠,但不需要建管道,直接按IP发过去
总结:①TCP传输可靠,但效率低
②UDP传输不可靠,但效率高
二、网络编程SOCKET
语法:
1 socket.socket(socket.AF_INET,socket.SOCK_STREAM)
其中:
socket.AF_UNIX:用于本机进程间通讯,为了实现两个进程间的通讯,可以通过创建一个本地的socket来完成(一个机器两个不同的软件)。
socket.AF_INET:我们只关心网络编程,因此大多使用这个(还有socket.AF_INET6被用于ipv6。)
socket.SOCK_STREAM:制动使用面向流的TCP协议。
socket.SOCK_DGRAM:指向UDP协议。
2.1 socket套接字
s.recv(1024)接受数据
s.send(1024)发送数据
s.recvfrom()接收所有数据
s.sendall()发送所有数据(本质是循环调用send)
s.sendto(信息,(IP地址,端口号)),将发给服务端的消息、(IP地址,端口号)发给服务端。
s.close()关闭套接字
一个sendto对应一个recvfrom
2.2 TCP
2.2.1 服务端
由上图可知,服务端需要先建立SOCKET链接,首先需要导入socket模块,并链接。
1 importsocket2 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
之后就需要绑定(主机,端口号)到套接字,开