linux socket 手册,Linux系统编程手册:socket

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

LISTEN TCP正等待从对端TCP节点发来的连接请求。

SYN_SENT TCP发送了一个SYN报文,代表应用程序执行了一个主动打开的操作,并等待对端回应以完成连接的建立。

SYN_RECV 之前处于LISTEN状态的TCP节点收到了对端发送的SYN报文,并已经通过发送SYN/ACK报文做出了响应(即,这个TCP报文同时设置了SYN和ACK位),正等待对端TCP节点发送一个ACK以完成连接的建立。

ESTABLISHED 与对端TCP节点间的连接建立完成。数据报文此时可以在两个TCP节点间双向交换。

FIN_WAIT1 应用程序关闭了连接。TCP节点发送一个FIN报文到对端,以此终止本端的连接,并等待对端发来的ACK。

FIN_WAIT2 之前处于FIN_WAIT1状态的TCP节点已经收到了对端TCP节点发来的ACK。

CLOSING 之前处于FIN_WAIT1状态的TCP节点收到了对端的FIN而不是ACK,这表示对端也正在尝试执行一个主动关闭(换句话说,两个节点几乎在同一时刻发送了FIN报文,这种情况非常罕见)。

TIME_WAIT 完成主动关闭后,TCP节点收到了FIN报文,这表示对端执行了一个被动关闭。此时这个TCP节点将在TIME_WAIT状态中等待一段固定的时间。这是为了确保TCP连接能够可靠地终止,同时也是为了确保任何老的重复报文在重新建立同样的连接之前在网络中超时消失。当这个固定的时间段超时后,连接就关闭了,相关的内核资源都得到释放。

CLOSE_WAIT TCP节点从对端收到FIN报文后将处于CLOSE_WAIT状态(被动关闭)。

LAST_ACK 应用程序执行被动关闭,而之前处于CLOSE_WAIT状态的TCP结点发送一个FIN报文给对端,并等待对端的确认。当收到对端发来的确认ACK报文时,连接关闭,相关的内核资源都会得到释放。

TCP连接的建立connet调用导致客户端TCP节点发送一个SYN报文到服务器端TCP结点。这个报文将告知服务器有关客户端TCP结点的初始序列号。这个信息是必要的,因为序号不会从0开始。

服务器端TCP结点必须确认发送端发来的TCP SYN报文,并告知客户端自己的初始序列号(因为流式套接字是双向的,需要两个序列号)。服务器端TCP结点返回一个同时设定SYN和ACK控制位的报文,这样就能同时执行这两种操作。

客户端TCP结点发送一个ACK报文来确认服务器端TCP结点的SYN报文。

TCP连接的终止

在一个TCP连接中,其中一端的应用程序执行close调用(主动关闭);稍后,连接另一端的应用程序也执行一个close调用(被动关闭)。客户端执行一个主动关闭,这将导致客户端TCP节点发送一个FIN报文给服务器。

在接收到FIN报文之后,服务端TCP结点发出ACK报文作为响应。之后在服务器端,任何对read操作的尝试都会产生文件结尾(EOF,即0)。

稍后,当服务器关闭这端的连接时,服务器端TCP节点发送FIN报文到客户端。

客户端TCP节点发送ACK报文作为响应,以此来确认服务器端发来的FIN报文。

SHUTDOWN系统调用

close调用完成的是全双工的关闭,也就是说application通过close将TCP套接字的发送和接收通道都关闭了。我们可以使用shutdown系统调用关闭连接的其中一个通道(半双工的关闭)。

将参数how指定为SHUT_WR或者SHUT_RDWR将开始TCP链接的终止步骤,本地TCP节点将迁移到FIN_WAIT1状态,收到ACK之后进入FIN_WAIT2状态,同时对端TCP节点将迁移到CLOSE_WAIT状态。

SHUT_RD在TCP套接字中是没有实际意义的操作,这是因为大多数TCP协议的实现都没有为SHUT_RD提供所期望的行为。

TIME_WAIT状态实现连接的可靠终止。

让老的重复的报文段在网络中过期失效,这样在建立新的连接是将不再会接受到它们。

TIME_WAIT状态区别于其他状态的地方在于:导致该状态迁移到CLOSED状态的事件是超时。超时时间为2MSL,这里的MSL(报文最大生存时间)是TCP报文在网络中的最大生存时间。IP首部中有一个8位的生存时间字段TTL,如果在报文从源主机到目的主机间传递时,在规定的跳数(经过的路由器)内报文没有到达目的地,那么该字段用来确保所有的IP报文最终都会被丢弃。MSL是IP报文在超过TTL限制前可在网络中生存的最大估计时间。

BSD的socket实现假设MSL为30秒,Linux遵循了BSD规范,因此Linux上的TIME_WAIT状态将持续60s。但是RFC 1122建议MSL的值为2min,因此在遵循了这个建议的实现中,TIME_WAIT状态将持续4min。

确保能可靠地终止连接

TCP在挥手时需要进行4次报文交换,其中最后一个ACK报文是由主动关闭一方发送到被动关闭一方。假设这个ACK在网络中因为某种原因被丢弃了,那么被动关闭一方会重传它的FIN报文,让执行主动关闭的一方在发出ACK之后保持在TIME_WAIT状态一段时间,可以确保它在这种情况下会重传ACK报文。如果没有TIME_WAIT状态(即主动关闭的一方在发出ACK就不存在了),那么被动关闭一方重传的FIN会收到RST,而RST会被解释为一个错误。

确保老的重复的报文在网络中过期消失

如果连接已关闭,且没有TIME_WAIT状态。此时使用完全相同的信息建立一个新的连接,有可能会收到旧连接的报文。

监视套接字:netstat

默认情况下,netstat会同时显示出UNIX domain和Internet domain已连接的套接字信息。选项描述-a显示所有套接字信息,包括监听套接字

-e显示出扩展信息(包括套接字属主的用户ID)

-c连续重新显示套接字信息(每秒刷新显示一次)

-l只显示监听套接字的信息

-n显示IP地址、端口号并以数字形式显示出用户名称

-p显示进程ID号以及套接字所归属的程序名称

-inet显示Internet domain套接字的信息

-tcp显示Internet domain TCP套接字的信息

-udp显示Internet domain UDP套接字的信息

-unix显示UNIX domain套接字的信息

套接字选项

系统调用setsockopt和getsockopt是用来设定和获取套接字选项的。

#include

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);

int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

/* 均为成功返回0,失败返回-1 */sockfd代表指向套接字的文件描述符。

level指定了套接字选项所适用的协议(如TCP或者IP)。SOL_SOCKET表示选项作用于套接字API层。

optname标识了我们希望设定或取出的套接字选项。

optval是一个指向缓冲区的指针,用来指定或者返回选项的值,根据选项的不同,这个参数可以是一个指向整数或结构体的指针。

optlen指定了optval所指向的缓冲区空间大小(字节数)。setsockopt中,为值参数;getsockopt中,为值结果参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值