网络套接字【Linux网络编程】

一、预备知识

1、端口号

端口号是一个2字节16位的整数,它是用来唯一地标识改主机上的一个网络应用层的进程。

网络套接字【Linux网络编程】_第1张图片

2、socket

IP地址能标识唯一的一台主机,端口号能标识一台主机上唯一的进程(一个进程可以绑定多个端口号,但是一个端口号不能被多个进程绑定)。

IP+端口号:标识全网唯一的一个进程。

IP+端口号就是socket(套接字)

进程pid已经能标识一台主机上的进程的唯一性了,为什么还需要端口号?

从技术角度看,用进程pid去标识进程唯一性是可以实现的,只是没有这么设计,因为想让系统功能和网络功能解耦。

二、简单认识TCP和UDP协议

TCP(Transmission Control Protocol)(传输控制协议)

网络套接字【Linux网络编程】_第2张图片

UDP(User Datagram Protocol)(用户数据报协议)

网络套接字【Linux网络编程】_第3张图片

有无连接时指,是否需要在数据传送前,保证通信双方已建立了连接(有连接例子:打电话前“喂?”“喂?”来判断双方是否听得到,再讲话;无连接例子:发邮件)

可靠传输:如果数据丢失,传输层会将数据自动补发。

面向字节流和面向数据报是两个相对概念,面向数据报的数据是有明显边界的,发一个收一个。

注:可靠是一个中性词,不可靠并不是一个贬义词,可靠传输是有成本的;它们只是用来描述特征,要根据具体场景来选择两种协议。

 三、网络字节序

内存中的多字节数据相对内存地址有大端和小端之分,也就意味着,A主机是大端,B主机是小端,他们俩进行网络通信,就有可能面临这样的问题:A按大端发送数据,B按小端解析数据。

为了解决这个问题:

直接规定不管大端机还是小端机网络数据流都采用大端字节序,即低地址高字节。

如果当前发送主机是小端,就先将数据转换成大端再发送。

有些字段可能需要我们自己进行大小端转换并发送,可以用以下接口:

网络套接字【Linux网络编程】_第4张图片

四、socket编程接口

网络套接字【Linux网络编程】_第5张图片 

五、sockaddr结构

套接字编程的种类:

1、域间套接字(同一个机器内)

2、原始套接字(绕过传输层,访问网络层或数据链路层,网络工具)

3、网络套接字(用户间的网络通信)

为了把这么多网络接口统一抽象化,参数类型必须是统一的。

网络套接字【Linux网络编程】_第6张图片

通过判断前两字节数据的类型,来决定后面如何解析

 

你可能感兴趣的:(Linux网络编程,linux,服务器,运维)