网络编程——协议基础

本篇包括网络编程概述、UDP简介、TFTP简介、TCP编程等 。
目录
一、tcp/ip协议简介
二、端口
三、IP地址
四、mac地址
五、socket简介
六、UDP网络通信过程
七、模拟QQ聊天-多线程实现
八、wireshark抓包工具的使用
九、tftp下载器的使用(tftpd64或tftpd32)
十、UDP广播
十一、TCP服务器、客户端简介及实现
11.1 TCP简介
11.2 TCP和UDP通信模型
11.3 Python实现tcp服务器和客户端
一、tcp/ip协议简介
tcp/ip不是两个协议,而是一个协议组,实际为4层,逻辑上可以为7层,如下图所示:

网络编程——协议基础

文章插图
 
二、端口
为什么使用端口?只有ip地址时只知道发往哪个电脑而不知道发往哪个程序,端口用来辨识要发往的具体程序 。
为什么不用PID辨识进程?因为进程是动态的,远端电脑可能不知道本地的pid号 。
知名端口:大家都知道的约定好的端口,如80端口为HTTP服务,21端口为FTP服务,范围为0~1023 。
动态端口:用户自己定义的端口,范围为1024~65535.
查看端口命令:netstat -an
注意:在同一个OS中,端口不允许相同,如果某个端口已经被使用了,那么在这个进程释放这个端口之前,其他进程不能使用这个端口 。因为端口用来区分一个进程 。
网络编程——协议基础

文章插图
 
三、IP地址
用来逻辑上表示网络上的唯一一台电脑 。
注意:一个电脑可以有多个网卡,即多个IP地址!
IP地址分类
其中网络号固定不变,表示位于同一网络中的电脑,主机号为当前网络中的电脑号 。
主机号为0时表示网段号,主机号为255时为网关 。
D类用于多播(不是广播),例如视频会议,只有一些人可以看到 。
E类实验和开发用 。
网络编程——协议基础

文章插图
 
私有ip
用于局域网中,访问公网时不能使用,需要转换为公有ip访问外网 。范围如下:
网络编程——协议基础

文章插图
 
注意
IP地址127.0.0.1~127.255.255.255用于回路测试,即测试当前电脑tcp/ip协议能不能用,例如ping 127.0.0.1,即使拔掉网线也能ping得通 。
linux服务器开发学习视频资料,包括Linux,Nginx,ZeroMQ,MySQL,redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等 。需要知识技术学习视频文档资料的朋友可以后台私信【架构】获取
网络编程——协议基础

文章插图
 

网络编程——协议基础

文章插图
 
四、MAC地址
网卡的序列号,形如XX:XX:XX:XX:XX:XX,六组十六进制数,前三组表示厂商序列号,后三组表示网卡序列号 。
五、socket简介
socket:通过网络使进程间通信 。
注意:一个进程可以有多个socket!
python测试程序如下:
网络编程——协议基础

文章插图
 
端口绑定(只能绑定自己的端口!)
上面程序每次运行时操作系统为它分配的端口不一样,这导致了远端电脑不知道每次运行的端口,不能发送信息到本地 。
python程序如下:
注意:bindAddr中第一个参数为空,因为该参数表示本地IP地址,但本地可能有多个IP,空表示任意ip都进行绑定 。
网络编程——协议基础

文章插图
 
六、UDP网络通信过程
应用层填写需要发送的数据;传输增加上端口号等;网络层加上目的ip等;链路层加上目的mac等;如下图:
网络编程——协议基础

文章插图
 
七、模拟QQ聊天-多线程实现
全双工实现QQ聊天,代码如下:
from threading import Thread
from socket import *
 
#1. 收数据,然后打印
def recvData():
while True:
recvInfo = udpSocket.recvfrom(1024)
print(">>%s:%s"%(str(recvInfo[1]), recvInfo[0]))
 
#2. 检测键盘,发数据
def sendData():
while True:
sendInfo = input("<<")
udpSocket.sendto(sendInfo.encode("gb2312"), (destIp, destPort))
 


推荐阅读