[计算机网络] 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参数可以保持连接一直有效。

posted @ 2022-02-16 21:33  Cheung-10  阅读(1)  评论(0)    收藏  举报