一、什么是socket?
TCP连接的两个端点称为socket,它右端口拼接到ip地址后构成(socket=ip地址:端口号)。每一条tcp连接唯一地被通信两端的两个socket确定。socket是应用进程和运输层协议之间的接口,它定义了应用进程为了获得网络通信服务时与操作系统交互的机制。
在套接字以上的进程受应用程序的控制,套接字以下的运输层协议软件受操作系统的控制。所以,应用程序需要使用tcp/ip协议进行通信是,就必须通过套接字与操作系统交互(使用系统调用函数)并请求其服务。
二、应用程序使用TCP服务过程中的系统调用顺序
1、建立连接阶段
不管是服务端还是客户端,当应用程序需要使用socket进行通信时,首先发起socket系统调用,请求操作系统创建一个“套接字”。这个调用的实际效果是请求操作系统把网络通信所需要的一些系统资源(存储器空间、CPU时间、网络带宽等)分配给应用进程。这些资源的总和用一个套接字描述符表示(套接字描述符中有一个指针指向存放套接字的地址)。操作系统将这个套接字描述符返回给应用程序。它是所有网络系统调用中的第一个参数。操作系统在处理的过程中,通过该描述符得到应用程序服务需要使用的资源信息。一台主机中可能存在多个套接字,它们的描述符用一个套接字描述符表来存放。
套接字被创建后,它的端口和ip都是空的,需要发起bind系统调用来绑定本地地址和端口。服务端是绑定本地地址和熟知的端口号(比如8080),客户端可以不调用bind,由操作系统分配动态端口号,通信结束后回收。
服务器调用bind后,还需要调用listen把套接字设置为被动状态,以便随时接受请求。无连接的UDP服务不调用listen。