一、预备知识
1、端口号
端口号是一个2字节16位的整数,它是用来唯一地标识改主机上的一个网络应用层的进程。
2、socket
IP地址能标识唯一的一台主机,端口号能标识一台主机上唯一的进程(一个进程可以绑定多个端口号,但是一个端口号不能被多个进程绑定)。
IP+端口号:标识全网唯一的一个进程。
IP+端口号就是socket(套接字)
进程pid已经能标识一台主机上的进程的唯一性了,为什么还需要端口号?
从技术角度看,用进程pid去标识进程唯一性是可以实现的,只是没有这么设计,因为想让系统功能和网络功能解耦。
二、简单认识TCP和UDP协议
TCP(Transmission Control Protocol)(传输控制协议)
UDP(User Datagram Protocol)(用户数据报协议)
有无连接时指,是否需要在数据传送前,保证通信双方已建立了连接(有连接例子:打电话前“喂?”“喂?”来判断双方是否听得到,再讲话;无连接例子:发邮件)
可靠传输:如果数据丢失,传输层会将数据自动补发。
面向字节流和面向数据报是两个相对概念,面向数据报的数据是有明显边界的,发一个收一个。
注:可靠是一个中性词,不可靠并不是一个贬义词,可靠传输是有成本的;它们只是用来描述特征,要根据具体场景来选择两种协议。
三、网络字节序
内存中的多字节数据相对内存地址有大端和小端之分,也就意味着,A主机是大端,B主机是小端,他们俩进行网络通信,就有可能面临这样的问题:A按大端发送数据,B按小端解析数据。
为了解决这个问题:
直接规定不管大端机还是小端机网络数据流都采用大端字节序,即低地址高字节。
如果当前发送主机是小端,就先将数据转换成大端再发送。
有些字段可能需要我们自己进行大小端转换并发送,可以用以下接口:
四、socket编程接口
五、sockaddr结构
套接字编程的种类:
1、域间套接字(同一个机器内)
2、原始套接字(绕过传输层,访问网络层或数据链路层,网络工具)
3、网络套接字(用户间的网络通信)
为了把这么多网络接口统一抽象化,参数类型必须是统一的。
通过判断前两字节数据的类型,来决定后面如何解析