1、网络模型与协议
ISO模型 TCP/IP模型
应用层 应用层
表示层
会话层
传输层 传输层
网络层 Internet层
数据链路层 网络接口层
物理层
2、地址
物理地址:对于以太网来说,就是一个以16进制表示的48位的网卡地址(此地址在生产的过程中就已经固定了),每个字节用冒号隔开,固有六部分。
IP地址:一个与底层硬件技术无关的通用地址(用32位来标示,该32位分为两部分,网络ID和主机ID,为了方便识别,该32位是用点号每字节隔开的,故有四部分),IP地址按格式可分为A,B,C,D,E五大类。
3、端口
就是让同一台计算机上的不同的程序同时互不干扰的访问到网络,即不同的进程可以绑定到不同的端口上来实现,TCP/UDP协议通常采用16(16位的无符号整数,即端口号范围是0~65535)位的端口来识别他们。
4、IP协议:主要用来负责确定路由,当到达同一目的地有多条路由时,IP协议会选择一条最短路由来将数据分组传送到目的计算机。
数据报:IP协议定义的数据单元的格式
主要数据段含义
A、版本
表示该数据报采用的是哪个版本的IP协议,对于IPv4该字段的值为4,对于IPv6,则为6.
B、总长度
IP首部和数据的总长度
C、生存期
表示数据报在网络上的最大生存时间(time to live,TTL).数据报每经过一个路由器,路由器的TTL值减1,当TTL减为0时,数据报将被丢失。并且会由该路由器向发送者返回一个ICMP超时报文,告知该数据丢失,TLL默认值为64,最大值是255。
D、协议
说明发送数据报所使用的的协议。
E、报头校验
用于检查IP首部的完整性,该字段只校验IP首部,不校验数据
F、源IP地址
为发送数据报的源计算机的IP地址
G、目的IP地址
接收数据报的目的计算机的IP地址
H、IP选项
是一个可选的字段,主要用于网络测试
5、套接字编程(即Linux下的网络编程)
A、套接字地址结构
结构 struct sockaddr 定义了一种通用的套接字地址,可以在linux/socket.h中查看其定义的代码
每种协议族都有自己的协议地址格式,TCP/IP协议族的地址格式为结构体 struct sockaddr_in ,其原型在 netinet/in.h 头文件中。struct sockaddr 与 struct sockaddr_in 都是16字节,通常在编写基于TCP/IP协议的网络程序时,使用sockaddr_in 来设置地址,然后通过强制类型转换成sockaddr类型。
B、创建套接字
socket函数来创建一个套接字。该函数原型在linux/socket.h 的头文件中(man socket)。
C、建立链接
函数connect 用来在一个指定的套接字上创建一个链接,通常一个面向连接的套接字(如TCP套接字)只能调用一次 connect函数,面对于无连接的套接字(如UDP套接字)则可以多次调用connect 函数以改变与目的地址的绑定。
D、绑定套接字
函数bind用来将一个套接字和某个端口绑定在一起。(man 2 bind)
socket 函数只是创建一个套接字,这个套接字将工作在哪个端口上程序并没有指定。在客户机/服务器模型中,服务器端的IP地址和端口号一般是固定的,因此在服务器端的程序中,使用bind函数将一个套接字和某个端口绑定在一起。该函数一般只有服务器端的程序调用。
E、在套接字上监听
函数listen 把套接字转换为被动监听
由函数 socket 创建的套接字为主动套接字,这种套接字可以主动请求链接到某个服务器(通过connect)但是作为服务端的程序,通常在某个端口上监听等待来自客户端的连接请求,在服务器端一般是先调用函数 socket 创建一个主动套接字,然后调用函数 bind 将套接字绑定到某个端口上,接着再调用函数 listen 将该套接字转换为监听套接字,等待客户端的链接请求。
一般多个客户端链接到一个服务器,服务器 向这些客户端提供某种服务,服务端设置一个链接队列,记录已经建立的链接,参数backlog 指定了该链接队列的最大长度,如果链接队列已经达到最大,之后的链接请求将被服务器拒绝。
F、接受连接
函数accept用来接受一个链接请求。
只能对面向链接的套接字使用accept函数。accept执行成功后将创建一个新的套接字,并且为这个新的套接字分配一个套接字描述符,并将其返回。这个新的套接字描述符与打开文件的时返回的文件描述符类似,进程可以利用这个新的套接字描述符与客户端交换数据,参数s指定的套接字继续等待客户端的链接请求。
G、TCP套接字的数据传输
1、发送数据
函数 send 用来在TCP套接字上发送数据,该函数只能对处于链接状态的套接字使用,参数s为已经建立好链接的套接字描述符,即accept函数的返回值,参数msg指向存放待发数据的的缓冲区,参数len 为待发数据的长度。(执行成功只说明数据写入套接字的缓冲区中,并不表示数据已经成功的通过网络发送到目的地)
2、接收数据
函数recv用来在TCP套接字上接收数据
函数recv从参数S 指定的套接字描述符(必须是面向链接的套接字)上接收数据并保存到参数buf所指定的缓冲区,参数len为缓冲区长度。
H、UDP套接字的数据传输
1、发送数据
函数sendto用来在UDP套接字上发送数据,该函数的功能与send类似,但函数 sendto 不需要套接字处于链接状态,所以该函数通常用来发送UDP数据,同时应为是无连接的套接字,故在使用时需指定数据 的目的地址。
2、接收数据
函数recvfrom 用来实现该功能,与recv函数类似,只是该函数可以用于无连接的套接字。
I、关闭套接字
函数close用来关闭一个套接字描述符,它与关闭文件描述符是类似的。函数 shutdown 与函数close()类似,但功能更强大,可以对套接字的关闭进行一些更细致的控制,它容许套接字进行单向关闭或全部禁止。
阅读(1102) | 评论(0) | 转发(0) |