网络编程Socket套接字
首先明白,IP地址和MAC地址的区别是什么?
变和不变的区别。在数据的传输过程中,必然经过路由器连接起来的一个个局域网,在局域网里通过MAC地址给目的主机或者下一跳路由器发送数据,因此MAC地址是不停的变换的,而源和目的IP不能改变,IP是查询路由表的方向标,IP变了就找不到目的地。
如此便不需要IP直接用硬件地址不好吗?
事实上存在着各种各样的网络,各式各样的硬件地址格式,要使异构的网络间通信需要非常复杂的硬件地址转换。IP屏蔽了底层细节,让用户看来所有主机就像在一个网络上通信。
在一个局域网内如何通过IP地址找到下一跳MAC地址呢?
局域网上的每个主机有一个ARP缓存表,记录了主机IP和硬件地址的对应关系。当主机要往目的主机发送数据先查表,找到下一跳主机的硬件地址然后发送。若表中没有映射关系,主机发送一个广播请求,让目的主机响应并建立映射关系,称为ARP协议。
什么是套接字
两个主机上的应用想要通信只有IP地址是不够的,数据从源主机送达到目的主机也无法具体交付,因为一个主机进程可不止一个。所以套接字唯一标识了网络上某台主机的某个进程,同时也表明网络通信本质是利用网络链路的进程间通信。套接字的格式是 IP:端口号 。
利用端口号唯一标识主机上一个需要网络通信的进程,并不是每个进程都需要占用端口号。
利用套接字编程
TCP/UDP
两个细节
- TCP/IP规定了大端字节序作为网络传输字节序
- sockaddr 结构是抽象的网络编程接口,适用各种网络协议。(接口只有一个,接口种类多)
多进程多线程服务器,客户端模板
https://github.com/zzaiyuyu/Server-Client/tree/master
优点 | 缺点 | |
---|---|---|
多进程 | 可同时处理多个请求 | 有请求才创建进程,进程个数有上限,进程切换开销大 |
多线程 | 线程切换开销较小 | 健壮性缺乏 |
应用层HTTP
简单的http服务器:https://github.com/zzaiyuyu/Server-Client/blob/master/http.c
协议:保证发送方构造的数据能被接收方正常解析
http协议是人为规定好的,基于请求响应过程,分为请求报文和响应报文。
请求报文格式为请求行+Header+空行+正文,响应报文类似。请求行中包含HTTP方法。
最常用的HTTP方法
- GET:从指定的资源请求数据
- POST:向指定的资源提交要被处理的数据
资源是指URL中包含的web服务器地址最后一个/后面的文件。
另外http协议是无状态的,服务器不会记录用户的上下文关系。