互联网的实现分成好几层。每┅层都有自己的功能就像建筑物一样,每一层都靠下一层支持如何分层有不同的模型,有的模型分七层有的分四层。我觉得把互聯网分成五层,比较容易解释最底下的一层叫做"实体层"(Physical Layer),最上面的一层叫做"应用层"(Application Layer)中间的三层(自下而上)分别是"链接层"(Link Layer)、"网络层"(Network Layer)和"传输层"(Transport Layer)。越下面的层越靠近硬件;越上面的层,越靠近用户
Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可
创建Socket
时,AF_INET
指定使用IPv4协议如果要用更先进的IPv6,就指定为AF_INET6
SOCK_STREAM
指定使用面向流的TCP协议,这样一个Socket
对象就创建成功,但是还没有建立连接
注意参数是一个tuple
,包含地址和端口号
TCP連接创建的是双向通道,双方都可以同时给对方发数据但是谁先发谁后发,怎么协调要根据具体的协议来决定。例如HTTP协议规定客户端必须先发请求给服务器,服务器收到后才发数据给客户端
# 每次最多接收1k字节: # 每次最多接收1k字节:
listen()
方法传入的参数指定等待连接的最大数量。
每个连接都必须创建新线程(或进程)来处理否则,单线程在处理连接的过程中无法接受其他客户端的连接:
TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据相对TCP,UDP则是面向无连接的协议
使用UDP协议时,不需要建立连接只需要知道对方的IP地址和端口号,就可以直接发数据包但是,能不能到达就不知道了
虽然用UDP传输数据不可靠,但它的优点是和TCP比速度快,對于不要求可靠到达的数据就可以使用UDP协议。
创建Socket时SOCK_DGRAM
指定了这个Socket的类型是UDP。绑定端口和TCP一样但是不需要调用listen()
方法,而是直接接收来洎任何客户端的数据:
recvfrom()
方法返回数据和客户端的地址与端口这样,服务器收到数据后直接调用sendto()
就可以把数据用UDP发给客户端。
注意这里渻掉了多线程因为这个例子很简单。
客户端使用UDP时首先仍然创建基于UDP的Socket,然后不需要调用connect()
,直接通过sendto()
给服务器发数据:
从服务器接收数据仍然调用recv()
方法