Socket套接字网络编程

网络编程Socket套接字

首先明白,IP地址和MAC地址的区别是什么?

变和不变的区别。在数据的传输过程中,必然经过路由器连接起来的一个个局域网,在局域网里通过MAC地址给目的主机或者下一跳路由器发送数据,因此MAC地址是不停的变换的,而源和目的IP不能改变,IP是查询路由表的方向标,IP变了就找不到目的地。

如此便不需要IP直接用硬件地址不好吗?

事实上存在着各种各样的网络,各式各样的硬件地址格式,要使异构的网络间通信需要非常复杂的硬件地址转换。IP屏蔽了底层细节,让用户看来所有主机就像在一个网络上通信。

在一个局域网内如何通过IP地址找到下一跳MAC地址呢?

局域网上的每个主机有一个ARP缓存表,记录了主机IP和硬件地址的对应关系。当主机要往目的主机发送数据先查表,找到下一跳主机的硬件地址然后发送。若表中没有映射关系,主机发送一个广播请求,让目的主机响应并建立映射关系,称为ARP协议


什么是套接字

两个主机上的应用想要通信只有IP地址是不够的,数据从源主机送达到目的主机也无法具体交付,因为一个主机进程可不止一个。所以套接字唯一标识了网络上某台主机的某个进程,同时也表明网络通信本质是利用网络链路的进程间通信。套接字的格式是 IP:端口号 。

利用端口号唯一标识主机上一个需要网络通信的进程,并不是每个进程都需要占用端口号。

利用套接字编程

TCP/UDP

两个细节

  1. TCP/IP规定了大端字节序作为网络传输字节序
  2. 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方法

  1. GET:从指定的资源请求数据
  2. POST:向指定的资源提交要被处理的数据

资源是指URL中包含的web服务器地址最后一个/后面的文件。

另外http协议是无状态的,服务器不会记录用户的上下文关系。

猜你喜欢

转载自blog.csdn.net/hanzheng6602/article/details/80936637