connect函数将激发TCP的三路握手过程,而且仅在连接建立成功或出错时才返回。CLOSED状态到SYN_SENT状态,若成功则再转移到ESTABLISHED状态。
    对于bind函数,如果TCP服务器没有把IP地址捆绑到它的套接字接口,内核就把客户发送的SYN的宿IP地址作为服务器的源IP地址。如果选择指定IP地址为通配地址,那么内核将等到套接口已连接(TCP)或已在套接口上发出数据报(UDP)时才选择一个本地IP地址。
    如果让内核来为套接字选择一个临时端口号,那么必须注意,bind并不返回所选的值,bind的第二个参数有const限定词,必须调用getsockname来返回协议地址。
    listen函数仅由TCP服务器调用,当socket函数创建一个套接口时,它被假设为一个主动套接口(将调用connect),listen函数把一个未连接的套接口转换成一个被动套接口,指示内核应该接受指向该套接口的连接请求,调用listen导致套接口从CLOSED状态转到LISTEN状态。listen第二个参数规定了内核应该为相应套接口排队的最大连接个数。
    内核为为任何一个给定的监听套接字维护两个队列:1.未完成连接队列,每个这样的SYN分节对应其中一项:已由某个客户发出并达到服务器,而服务器正在等待完成三路握手,这些套接字处于SYN_RCVD状态。2.已完成连接队列。每个已完成三路握手的客户对应其中一项,这些套接口处于ESTABLISHED状态。两个队列之和不超过backlog。
    源自Berkeley的实现为未完成项设置的超时值为75秒。
    如果一个客户的SYN到达时队列是满的,TCP就忽略该分节,也就是不发送RST,这种情况是暂时的,客户TCP将重发SYN,期望不久就能在这些队列中找到可用空间。如果服务器TCP立即用RST来响应,客户端的connect调用就会立即返回错误,强制应用进程处理这个情况,而不是让TCP的正常重传机制来完成。另外,客户无法识别作为SYN的响应的RST究竟是“该端口没有服务器在监听”还是意味着“该端口有服务器在监听,但是它的队列满了”。
    在三路握手完成之后,但在服务器调用accept之前到达的数据应由TCP服务器排队,最大数据量为相应已连接套接口的接收缓冲区大小。
    accept用于从已完成连接队列队头返回下一个已完成连接,如果队列为空,则进程被投入睡眠。一个服务器通常仅仅创建一个监听套接口,它在服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建一个已连接套接口。当服务器完成对于某个给定客户的服务时,相应的已连接套接口就被关闭。
    父进程中调用fork之前打开的所有描述字在fork返回之后由子进程分享。
    fork有两个典型用法:
    1.一个进程创建自身的拷贝,这样每一个拷贝都可以在另一个拷贝执行其他任务时同时处理各自的某个操作。这是网络服务器的典型用法。2.一个进程想要执行另外一个程序。先调用fork创建自身的一个拷贝,然后其中的一个拷贝(通常称为子进程)调用exec把自身替换成新的程序,这是诸如shell之类程序的典型用法。
    存放在硬盘上的可执行文件能够被Unix执行的唯一方法是:由一个现有进程调用六个exec函数中的某一个。,exec把当前进程映像文件替换成新的程序文件,而且该程序通常从main函数开始执行,进程id并不改变。
    进程在调用exec之前打开的描述字通常跨exec继续保持打开。我们可以使用fcntl设置FD_ClOEXEC描述字标志禁止掉。inetd服务器就利用了这个特性。

   

    Unix中编写并发服务器的最简单的方法是fork一个子进程来服务每个客户。当accept返回时,服务器调用fork,子进程服务客户(通过已连接套接口),父进程等待另一个连接(通过监听套接口)。父进程就关闭已连接套接口,这不会终止与客户的连接,因为套接口的引用技术只是由2减少为1,该套接口真正的清理和资源释放要等到其引用计数值到达0才发生。引用计数在文件表项中维护,它是当前打开着的引用该文件或套接口的描述字的个数。

 

    close一个TCP套接口的缺省行为是把该套接口标记成已关闭,然后立即返回到调用进程,该套接口描述字不能再由调用进程使用,也就是说不能再作为read和write的第一个参数。然而TCP将尝试发送已排队等待发送到对端的任何数据,发送完毕后发生的是正常的TCP连接终止序列。SO_LINGER套接口选项可以改变这种缺省行为。这个调用只是使套接口相应描述字的引用计数减少1,如果确实想在某个TCP连接发送一个FIN,可以用shutdown代替close。
    getsockname返回与某个套接口关联的本地协议地址。
    getpeername返回与某个套接口关联的远地协议地址。

Posted on 2011-11-27 10:51  SomethingReview  阅读(193)  评论(0编辑  收藏  举报