[计算机网络] socket和连接
1.Socket
socket是在传输层和应用层之间的一组API接口。
传入addr_t的时候注意地址信息中的参数应当转换为网络字节序(大端),而不是像windows这样的小端。
1)服务端使用socket
a.创建和初始化socket
b.与端口和地址信息绑定(bind)
c.监听端口(listen)
d.调用accept阻塞等待获得连接。
e.调用read和write等函数传递数据
f.调用close关闭socket(包括单次连接的socket和监听socket)
socket函数参数:协议域,socket类型(STREAM、DGRAM、RAW、PACKET、SEQPACKET),协议类型(TCP、UDP等)。
bind绑定的信息包括协议族信息(sa_family_t)、端口。
listen的作用是将socket设置为等待接收连接请求,参数为socket描述符、backlog(连接队列长度)。
accpet函数的作用是接收连接请求。它返回连接成功后的新socket描述符。
注:用于监听端口的socket一般只创建一个,仅负责与用户建立连接。当accept调用成功后,程序会得到内核创建的新的socket描述符用于和某一个用户的连接。
2)客户端使用socket
a.创建和初始化socket
b.绑定(bind)一个本地地址(这一步也可以略过,系统会将本机IP和一个随机端口填入)
c.调用connect函数与服务器建立连接
connect函数参数包括服务器socket地址。
2.Socket的实现
在unix系统中,socket为一个特殊类别的文件,一般socket和连接信息都由系统进行维护。
一个socket可以建立多个连接(每个连接由其对应的源地址、源端口、目的地址、目的端口四元组组成)。
socket缓冲区:1)每个TCP套接字有单独的IO缓冲区
2)IO缓冲区在创建套接字的时候自动生成
3)关闭套接字时,缓冲区中的数据将被丢失
4)读写缓冲区分离,大小一般为8k
socket阻塞模式:
1)TCP套接字默认为阻塞模式,write和send函数是阻塞写函数
a.若缓冲区长度小于发送数据的长度,则阻塞发送函数会被阻塞直到发送完毕
b.正在发送数据时,写缓冲区将被锁定,阻塞发送函数也会被阻塞
b.完成所有数据写入后,阻塞发送函数才会返回2)read和recv是阻塞读函数
a.若读缓冲区无数据,则会阻塞等待数据到来
b.若读取数据长度小于缓冲区数据长度,则数据会不断积压
c.完成数据读取后,阻塞接收函数才会返回
3.连接
socket接受到连接请求后会创建新的socket描述符,代表一个连接。
多个连接可以公用一个端口,由源地址和源端口进行区分。
当OS接受到无效或不能理解的tcp报文后,会返回RST。这种情况也可能是对应的套接字已经被销毁。
现在的操作系统中,会每个一段时间在维护的tcp连接上发送一次探测报文,确保连接依然有效。如果开启keep-alive参数可以保持连接一直有效。