第 2 页
TCP/IP简介
OSI模型和TCP/IP模型
TCP连接的建立
TCP连接的建立需要经过3次数据传输(三次握手),步骤如下:
服务器必须已经准备好接收客户的连接请求,这通过调用socket、bind和listen函数来完成。客户通过调用connect函数进行主动打开,这引起客户端发送一个SYN分节到服务器端。
服务器收到客户端发来的SYN分节后,必须发送ACK对其进行确认,同时发送一个自己的SYN分节给客户端,表示接受客户端建立连接的请求。
客户端发送ACK确认服务器SYN,建立连接成功。
TCP连接的终止
当数据传输完毕后,TCP需要发送4个分节终止该连接,释放TCP连接的步骤如下:
客户端应用进程调用close,调用close的结果就是发送一个FIN分节主动关闭连接。
服务器收到FIN后执行被动关闭,发送ACK对客户端的FIN分节进行确认。
当服务器将待发的数据发送完后,调用close关闭它的套接字,这导致它的TCP发送一个FIN分节给客户端。
接收到服务器的FIN分节后,对其发送一个ACK确认分节,当前的连接被彻底关闭。
第 2 页
套接字编程简介
套接字的类型
套接字支持各种通信协议,目前Linux系统常用的协议有以下两种:
INET:IP版本4。
INET6:IP版本6。
套接字类型是指创建套接字的应用程序要使用的通信服务的类型。Linux系统支持多种套接字类型,最常用的有以下几种:
SOCK_STREAM:流式套接字,提供面向连接、可靠的数据传输服务,数据按字节流、按顺序收发,保证数据在传输过程中无丢失、无冗余。TCP协议支持该套接字。
SOCK_DGRAM:数据报套接字,提供面向无连接的服务,数据收发无序,不能保证数据的准确到达。UDP协议支持该套接字。
SOCK_RAW:原始套接字。允许对低于传输层的协议或物理网络直接访问例如可以接收和发送ICMP报。常用于检测新的协议。
基本TCP套接字编程
TCP套接字编程
TCP套接字编程中,服务器端实现的步骤如下:
使用socket()函数创建套接字。
第 3 页
将创建的套接字绑定到指定的地址结构。
Listen()函数设置套接字为监听模式,使服务器进入被动打开的状态。
接受客户端的连接请求,建立连接。
接收、应答客户端的数据请求。
终止连接。
客户端实现的步骤相对比较简单:
使用socket()函数创建套接字。
调用connect()函数建立一个及TCP服务器的连接。
发送数据请求,接收服务器的数据应答。
终止连接。
socket()函数
客户端服务器端都存在,产生TCP套接字,作为TCP通信的传输端点
#include <sys/>
int socket(int family, int type, int protocol)
返回:非负套接字(sockfd)【0,1】-成功;-1-出错。
family:协议族;type:套接字类型; protocol:一般为0,除原始套接字外。
Family(确定协议类型)type(指明产生套接字类型)
AF_INET IPv4协议SOCK_STREAM 字节流套接口
AF_INET6IPv6协议SOCK_DGRAM 数据报套接口
第 4 页
【AF_LOCALunix域协议】SOCK_RAW 原始套接口
AF_ROUTE 路由套接口
【AF_KEY 密钥套接口】
bind() 绑定函数
绑定函数的作用就是为调用socket()函数产生的套接字分配一个本地协议地址,建立地址及套接字的对应关系。
#include <sys/>
int bind(int sockfd, const struct sockaddr *addr, socklen_len len)
返回:0-成功;-1-出错并置errno
Sockfd:套接字函数返回的套接字描述符server:指向特定协议的地址结构的指针
addrlen:套接字地址结构的长度
该函数指明套接字将使用本地的哪一个协议端口进行数据传送(IP地址和端口号),注意:协议地址addr是通用地址。
一般而言,服务器调用此函数,而客户则很少调用它。
绑定地址时,可以指定地址和端口号,也可以指定其中之一,甚至一个也不指定。通配地址:INADDR_ANY,其值一般为0,它通知内核选择IP地址。
IP地址端口结果
通配地址0内核选择IP地址和端口号
通配地址非0内核选择IP地址,进程指定端口
第 5 页
本地IP 0进程指定IP地址,内核选择端口
本地I
linuxunix网络编程复习资料 来自淘豆网m.daumloan.com转载请标明出处.