您的位置:首页 > 理论基础 > 计算机网络

TCP--IP详解之二(基本框架函数)

2013-12-28 17:25 316 查看
1. Socket

1.1. 失败返回-1.成功返回相应的描述符。在描述符用尽的时候会失败。因此大并发的时候可能失败。

1.2. 协议AF_XXX,与PF_XXX是一样的。

1.3. 协议类型:AF_INET,AF_INET6,AF_LOCAL(AF_UNIX),AR_ROUTE,AF_UNSPEC.

1.4. 套接口类型:SOCK_STREAM,SOCK_DGRAM,SOCK_RAW

2. Connect

2.1. 成功0,失败-1.

一旦调用connect就会从CLOSED进入SYN_SEND状态。返回时,如果连接成功则变为ESTABLISHED。否则

2.2. TCP引发三次握手。

2.2.1.1. SYN没响应,返回ETIMEOUT.

2.2.1.2. 如果响应为RST,则为硬错误。直接返回ECONNREFUSED

RST响应的三种场景:SYN到达,但没有端口侦听,如上;TCP想取消一个连接;TCP接收到一个不存在的连接上的分节。

2.2.1.3. 如果中间路由引发ICMP错误,则为软错误。一般会按一的重试机制重试,如果仍然不通,则返回主机不可达错误。EHOSTUNREACH或ENETUNREACH。

2.2.1.4. 如果失败,则套接口不能再用,必须关闭,重新socket创建新的描述符。

2.3. UDP也可以connect

2.3.1. UDP上connect只是设置远程ip和端口。

2.3.2. Connect可以修改远程的地址,因此一个UDP描述符可以和多个UDP服务器通信,但同一时刻只能跟一个地址(可以是广播地址)。断开连接使用AF_UNSPEC域。

2.3.3. 调用connect后的UDP称为已连接UDP,否则称为未连接UDP。

区别:已连接的则只能用和TCP相同的读写函数read,write,用sendto则不能再指定地址;已连接的UDP,内核只返回该地址的数据给UDP描述符;已连接的则可以得到异步错误,未连接的则不会得到异步错误。

2.3.4. 如果需要往一个地址发送多个包,则UDP也最好调用connect,这样可以提高性能,防止每次read,write都拷贝地址。

3. Bind

Bind的真正含义是给socket描述符绑定一个本地的接口ip或(和)端口。因此一般来说服务器必须要bind,客户可以不绑定。但是服务器也可以不绑定,只是这样系统将随机选择端口,对外无法提供固定端口;客户端也可以绑定,这样就可以使用固定的端口连接服务器。

3.1. Bind时如果端口为0,则会选择一个临时端口,相当于不指定端口。

3.2. Bind时如果指定通配地址,则只有客户连接进来的时候才会选择本地地址。

3.3. Bind失败一般为:EADDRINUSE;可以设置SO_REUSEADD或SO_REUSEPORT来修改行为。

4. Listen

修改socket的类型。将主动套接口修改为被动套接口,内核应接收指向该套接口的连接请求。套接口进入LISTEN状态。

4.1. 内核为socket维护两个队列。未完成连接队列,三次握手没完成的,处于SYN_RECD状态;已连接队列,完成三次握手,处于ESTABLISHED状态。

5. Accept

从已连接队列头部取出连接。

5.1. Accept默认为阻塞的,即如果队列为空,则调用阻塞。可以修改为非阻塞的。

5.2. Accept可以返回客户端的地址信息。也可以通过调用getpeername获取远端地址信息。

5.3. 本地地址可以使用getsockname获取。但UDP不能用getsockname。UDP需要先设置IP_RECVDSTADDR,再调用recvmsg获取。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: