<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Unix Socket on kamuszhou&#39;s blog</title>
    <link>https://ykyi.net/tags/unix-socket/</link>
    <description>Recent content in Unix Socket on kamuszhou&#39;s blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 26 Dec 2011 16:59:47 +0000</lastBuildDate>
    <atom:link href="https://ykyi.net/tags/unix-socket/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Unix网络编程 第13章 Daemon Processes and the inetd Superserver 笔记</title>
      <link>https://ykyi.net/?p=356/</link>
      <pubDate>Mon, 26 Dec 2011 16:59:47 +0000</pubDate>
      <guid>https://ykyi.net/?p=356/</guid>
      <description>&lt;p&gt;# The syslogd daemon runs in an infinite loop that calls select, waiting for any one of its three descriptors to be readable. it reads the log message and does what the configuration file says to do with that message. If the daemon receives the SIGHUP signal, it rereads its configuration file. So, what are the three descriptors that the select system call is waiting for ?  1. A unix domain socket is created and bound to the pathname /var/run/log (/dev/log on some systems). 2. A udp socket is created and bound to port 514(the syslog service). 3. The pathname /devklog is opened. Any error messages from within the kernel appears as input on this device. Newer implementation disable the creation of the UDP socket, unless specified by the administrator, as allowing anyone to send UDP datagrams to this port opens the system up to denial-of-service attacks, where some one could fill up the filesystem.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Unix网络编程 第十二章 IPv4 and IPv6 Interoperability</title>
      <link>https://ykyi.net/?p=352/</link>
      <pubDate>Mon, 26 Dec 2011 13:28:35 +0000</pubDate>
      <guid>https://ykyi.net/?p=352/</guid>
      <description>&lt;p&gt;# Ethernet header contains a type fileld of 0x0800, which identifies the frame as an IPv4 frame.&lt;/p&gt;
&lt;p&gt;# 若支持dual-stack的server既有IPv4又有IPv6。则IP层让server透明地既可处理IPv4又可处理IPv6.该server需要绑定到wildcard且未设置IPV6_V6ONLY socket option.&lt;/p&gt;
&lt;p&gt;# UNP Page359 Figure 12.5 Summary of interoperability between IPv4 and IPv6 clients and servers.&lt;/p&gt;
&lt;p&gt;# 尽可能用IPv6,  since an IPv6 client can still communicate with IPv4 servers, and vice versa.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Unix网络编程.第九章笔记</title>
      <link>https://ykyi.net/?p=307/</link>
      <pubDate>Sat, 17 Dec 2011 08:58:14 +0000</pubDate>
      <guid>https://ykyi.net/?p=307/</guid>
      <description>&lt;p&gt;# TCP 协议在1981年标准化，而SCTP协议则是在2000年由IETF组织标准化。IETF： Internet Engineering Task Force 互联网工程任务组成立于1985年。&lt;/p&gt;
&lt;p&gt;# SCTP支持两种类型的socket. one to one(为了方便现有的tcp程序迁移到sctp) 和 one to many.&lt;/p&gt;
&lt;p&gt;# sctp的sctp_bindx可以绑定多个地址，并且可以动态增删。但动态增删不影响已经存在的associations.不过各个unix分支不一定支持这个特性。&lt;/p&gt;
&lt;p&gt;# sctp_getpaddrs和sctp_getladdrs分别是getpeername和gethostname的sctp版。They are designed with the concept of a multihoming aware transport protocol.&lt;/p&gt;
&lt;p&gt;# sctp传输的报文是有边界的。sctp在传输层支持传输超大的message.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Unix网络编程.第七章笔记</title>
      <link>https://ykyi.net/?p=296/</link>
      <pubDate>Thu, 15 Dec 2011 06:33:56 +0000</pubDate>
      <guid>https://ykyi.net/?p=296/</guid>
      <description>&lt;div&gt;
  1.&amp;nbsp;有一个&amp;nbsp;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;Generic&amp;nbsp;Socket&amp;nbsp;Option&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;：&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;SO_BROADCAST&amp;nbsp;&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;用来开启是否充许广播。&lt;/span&gt;2.&amp;nbsp;仅有&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;TCP&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;支持&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;SO_DEBUG&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;。&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;Kernel&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;把详细的发送包的接收包信息存在一个环路&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;buffer&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;里。可以用&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;trpt&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;查看它。&lt;/span&gt;3.&amp;nbsp;SO_ERROR&lt;span style=&#34;font-family: 宋体;&#34;&gt;套接字选项只能被取得，不能被设置。如果进程阻塞在&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;select&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;调用里，不论是读还是写，&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;select&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;都会返回&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;conditions&amp;nbsp;set&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;。如果进程使用&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;signal-driven&amp;nbsp;I/O&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，则&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;SIGIO&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;信号会被发到这个进程或者它所在的进程组。进程用&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;getsockopt&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;得到&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;so_error&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;后，&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;so_error&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;就会被重置为&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;0.&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;如果&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;so_error&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;不为&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，此时调用&amp;nbsp;&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;read&amp;nbsp;&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;或者&amp;nbsp;&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;write&amp;nbsp;&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;就会立即返回&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;-1&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;errno&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;被置为&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;so_error&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;的值。&lt;/span&gt;&lt;/p&gt; 
  &lt;p&gt;
    &amp;nbsp;
  &lt;/p&gt;
  &lt;p&gt;
    &amp;nbsp;
  &lt;/p&gt;
  &lt;p&gt;
    4.&amp;nbsp;SO_KEEPALIVE&lt;span style=&#34;font-family: 宋体;&#34;&gt;在一个&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;tcp&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;连接没有任何收发达两个小时时会发一个&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;prob&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;给对方。两个钟喔。好长的时间啊！！！&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;Richard&amp;nbsp;Stevens&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;认为&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;SO_KEEPALIVE&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;应该改叫&amp;nbsp;&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;make-dead&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;。大多&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;Unix&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;的&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;kernel&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;把这个两小时时长存为一个系统级的变量。这意味着如果你用某种方法改变了这个时长，会影响这个操作系统的所有&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;socket.Richard&amp;nbsp;Stevens&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;认为想把这个时长改短的想法是错误理解了这个选项的意义。&lt;/span&gt;
  &lt;/p&gt;
  &lt;p&gt;
    5.&amp;nbsp;SO_LINGER&lt;span style=&#34;font-family: 宋体;&#34;&gt;仅仅适用于面向连接的&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;socket&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，比如&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;TCP&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;和&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;SCTP&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，因此不适用&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;UDP&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;。&lt;/span&gt;
  &lt;/p&gt;
  &lt;p&gt;
    Struct&amp;nbsp;linger{
  &lt;/p&gt;
  &lt;p&gt;
    int&amp;nbsp;l_onofff;
  &lt;/p&gt;
  &lt;p&gt;
    int&amp;nbsp;l_linger;
  &lt;/p&gt;
  &lt;p&gt;
    };
  &lt;/p&gt;
  &lt;p&gt;
    L_onoff&lt;span style=&#34;font-family: 宋体;&#34;&gt;为零是，&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;的&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;behavior&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;就是默认情况：&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;立即返回，&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;kernel&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;继续发送缓冲区内未发送的数据。当&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;l_onoff&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;不为零，而&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;l_linger&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;为&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;TCP&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;协议则会立即终止连接，发送&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;RST&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;给&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;peer&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;端，这样做避免了&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;TCP&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;的&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;TIME_WAIT&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;状态，这样的坏处是&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;:&amp;nbsp;leaves&amp;nbsp;open&amp;nbsp;the&amp;nbsp;possibility&amp;nbsp;of&amp;nbsp;another&amp;nbsp;incarnation&amp;nbsp;of&amp;nbsp;this&amp;nbsp;connection&amp;nbsp;being&amp;nbsp;created&amp;nbsp;within&amp;nbsp;2MSL&amp;nbsp;seconds&amp;nbsp;and&amp;nbsp;having&amp;nbsp;old&amp;nbsp;duplicate&amp;nbsp;segments&amp;nbsp;from&amp;nbsp;the&amp;nbsp;just-terminated&amp;nbsp;connection&amp;nbsp;being&amp;nbsp;incorrectly&amp;nbsp;delivered&amp;nbsp;to&amp;nbsp;the&amp;nbsp;new&amp;nbsp;incarnation.&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;对于&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;SCTP,&amp;nbsp;&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;也会发送一个&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;ABORT&amp;nbsp;chunk&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;给&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;peer.&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;第三种情况：如果&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;l_onoff&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;为真，&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;l_linger&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;不为&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;0.&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;则&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;不会立即返回，会最多等待指定的时长，在这段时间里&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;kernel&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;发送缓冲区内的数据给&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;peer&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;。如果在这段时间内发送完则&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;返回&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;0.&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;如果没有发送完毕，&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;就会返回&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;EWOULDBLOCK&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;send&amp;nbsp;buffer&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;里的数据会被丢弃。&lt;/span&gt;
  &lt;/p&gt;
  &lt;p&gt;
    6.&amp;nbsp;MSL:&amp;nbsp;maximum&amp;nbsp;segment&amp;nbsp;lifetime.
  &lt;/p&gt;
  &lt;p&gt;
    7.&amp;nbsp;因此&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;默认情况下立即返回，即使用&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;SO_LINGER&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;设置等待时间也在理论上存在&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;close&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;先于发送缓冲区的数据被&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;peer&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;端&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;acknowleded&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;的情况。因此一个更好的解决方案是用&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;shutdown&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;系统调用&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;with&amp;nbsp;a&amp;nbsp;second&amp;nbsp;argument&amp;nbsp;of&amp;nbsp;SHUT_WR&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;。在调用&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;shutdown&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;后，用&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;read&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;调用直到&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;read&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;返回&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，即收到&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;peer&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;端的&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;FIN&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;。&lt;/span&gt;
  &lt;/p&gt;
  &lt;p&gt;
    8.&amp;nbsp;UDP&lt;span style=&#34;font-family: 宋体;&#34;&gt;没有&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;congestion&amp;nbsp;control&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，如果发得太快，不仅仅&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;peer&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;端来不及收。&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;A&amp;nbsp;fast&amp;nbsp;sender&amp;nbsp;can&amp;nbsp;overwhelm&amp;nbsp;its&amp;nbsp;own&amp;nbsp;network&amp;nbsp;interface,&amp;nbsp;causing&amp;nbsp;datagrams&amp;nbsp;to&amp;nbsp;be&amp;nbsp;discarded&amp;nbsp;by&amp;nbsp;the&amp;nbsp;sender&amp;nbsp;itself.&lt;/span&gt;
  &lt;/p&gt;
  &lt;p&gt;
    9.&amp;nbsp;因为&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;tcp&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;在三次握手阶段的&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;SYN&amp;nbsp;segment&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;里交换窗口大小&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;(windows&amp;nbsp;scale)&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;。所以&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;tcp&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;的接收缓冲大小必须在&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;shank&amp;nbsp;hands&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;之前就设置好。&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;Connected&amp;nbsp;socket&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;从&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;listening&amp;nbsp;socket&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;继承这个选项。&lt;/span&gt;
  &lt;/p&gt;
  &lt;p&gt;
    10.&amp;nbsp;TCP&lt;span style=&#34;font-family: 宋体;&#34;&gt;的套接字缓冲区大小至少需要是&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;倍&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;MSS&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;的大小。&lt;/span&gt;这里指的套接字缓冲，如果是针对单向的传输，比如单向传一个文件，指的是发送方的发送缓冲和接收方的接收缓冲。如果是双向的传输，则指的是双方的接收和发送缓冲。为什么&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;tcp&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;套接字的缓冲区需要至少&amp;nbsp;&amp;nbsp;&amp;nbsp;是&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;倍&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;MSS&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;的大小呢？&lt;/span&gt;这是因为&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;tcp&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;的快恢复&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;(fast&amp;nbsp;recovery)&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;算法。快恢复算法定义：如果接收端连续收到三个同样的&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;ACK&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，就认为有&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;packet&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;丢失了。而接收端在&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;segment&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;丢失后，每收到新的&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;segment&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;就不停地重发一个重复的&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;ack&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;给&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;sender&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;。如果窗口大小小于&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;个&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;segments,&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;就不会有三个重复的&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;ACK,&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;所以快恢复算法就没办法工作了。&lt;/span&gt;
  &lt;/p&gt;
  &lt;p&gt;
    11.&amp;nbsp;What&amp;nbsp;is&amp;nbsp;bandwidth-delay&amp;nbsp;product.
  &lt;/p&gt;
  &lt;p&gt;
    A:&amp;nbsp;The&amp;nbsp;capacity&amp;nbsp;of&amp;nbsp;the&amp;nbsp;pipe&amp;nbsp;is&amp;nbsp;called&amp;nbsp;the&amp;nbsp;bandwidth-delay&amp;nbsp;product&amp;nbsp;and&amp;nbsp;we&amp;nbsp;calculate&amp;nbsp;this&amp;nbsp;by&amp;nbsp;multiplying&amp;nbsp;the&amp;nbsp;bandwidth(in&amp;nbsp;bits/sec)&amp;nbsp;times&amp;nbsp;the&amp;nbsp;RTT(in&amp;nbsp;seconds),&amp;nbsp;converting&amp;nbsp;the&amp;nbsp;result&amp;nbsp;from&amp;nbsp;bits&amp;nbsp;to&amp;nbsp;bytes.&amp;nbsp;&lt;span style=&#34;font-family: 宋体;&#34;&gt;即网速乘上&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;RTT.&lt;/span&gt;
  &lt;/p&gt;
  &lt;p&gt;
    12.&amp;nbsp;UDP&lt;span style=&#34;font-family: 宋体;&#34;&gt;没有&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;send&amp;nbsp;buffer&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，但有一个&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;send&amp;nbsp;buffer&amp;nbsp;size.&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;只要&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;socket&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;的&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;buffer&amp;nbsp;size&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;大于&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;LO_WATER&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，就永远是可写的。&lt;/span&gt;
  &lt;/p&gt;
  &lt;p&gt;
    13.&amp;nbsp;SO_REUSEADDR&lt;span style=&#34;font-family: 宋体;&#34;&gt;有四种用途。好难写。见&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;Unix&amp;nbsp;Network&amp;nbsp;Programming&amp;nbsp;Section&amp;nbsp;7.5&amp;nbsp;&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;影印版第&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;211&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;页啦。&lt;/span&gt;
  &lt;/p&gt;
  &lt;p&gt;
    14.&amp;nbsp;It&#39;s&amp;nbsp;Ok&amp;nbsp;for&amp;nbsp;the&amp;nbsp;MSS&amp;nbsp;to&amp;nbsp;be&amp;nbsp;different&amp;nbsp;in&amp;nbsp;each&amp;nbsp;direction.
  &lt;/p&gt;
  &lt;p&gt;
    15.&amp;nbsp;Nagle&lt;span style=&#34;font-family: 宋体;&#34;&gt;算法是为了减少&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;small&amp;nbsp;package&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;的数量.&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;The&amp;nbsp;algorithm&amp;nbsp;states&amp;nbsp;that&amp;nbsp;if&amp;nbsp;a&amp;nbsp;given&amp;nbsp;connection&amp;nbsp;has&amp;nbsp;outstanding&amp;nbsp;data,&amp;nbsp;then&amp;nbsp;no&amp;nbsp;small&amp;nbsp;packets&amp;nbsp;will&amp;nbsp;be&amp;nbsp;sent&amp;nbsp;on&amp;nbsp;the&amp;nbsp;connection&amp;nbsp;in&amp;nbsp;response&amp;nbsp;to&amp;nbsp;a&amp;nbsp;user&amp;nbsp;write&amp;nbsp;operation&amp;nbsp;until&amp;nbsp;the&amp;nbsp;existing&amp;nbsp;data&amp;nbsp;is&amp;nbsp;acknowledged.&amp;nbsp;Small&amp;nbsp;package&amp;nbsp;&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;指的是任何比&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;MSS&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;小的&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;package.&lt;/span&gt;
  &lt;/p&gt;
  &lt;p&gt;
    16.&amp;nbsp;Delayed&amp;nbsp;ACK&amp;nbsp;algorithm:&amp;nbsp;This&amp;nbsp;algorithm&amp;nbsp;causes&amp;nbsp;TCP&amp;nbsp;to&amp;nbsp;not&amp;nbsp;send&amp;nbsp;an&amp;nbsp;ACK&amp;nbsp;immediately&amp;nbsp;when&amp;nbsp;it&amp;nbsp;receives&amp;nbsp;data;&amp;nbsp;instead,&amp;nbsp;TCP&amp;nbsp;will&amp;nbsp;wait&amp;nbsp;some&amp;nbsp;small&amp;nbsp;amount&amp;nbsp;of&amp;nbsp;time&amp;nbsp;(typically&amp;nbsp;50-200ms)and&amp;nbsp;only&amp;nbsp;then&amp;nbsp;send&amp;nbsp;the&amp;nbsp;ACK.
  &lt;/p&gt;
  &lt;p&gt;
    17.&amp;nbsp;SCTP&lt;span style=&#34;font-family: 宋体;&#34;&gt;有一个&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;SCTP_AUTOCLOSE&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;套接字选项。&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;This&amp;nbsp;option&amp;nbsp;allows&amp;nbsp;us&amp;nbsp;to&amp;nbsp;fetch&amp;nbsp;or&amp;nbsp;set&amp;nbsp;the&amp;nbsp;autoclose&amp;nbsp;time&amp;nbsp;for&amp;nbsp;an&amp;nbsp;SCTP&amp;nbsp;endpoint.&amp;nbsp;The&amp;nbsp;autoclose&amp;nbsp;time&amp;nbsp;is&amp;nbsp;the&amp;nbsp;number&amp;nbsp;of&amp;nbsp;seconds&amp;nbsp;an&amp;nbsp;SCTP&amp;nbsp;association&amp;nbsp;will&amp;nbsp;remain&amp;nbsp;open&amp;nbsp;when&amp;nbsp;idle.&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;即&lt;/span&gt;&lt;span style=&#34;font-family: Times New Roman;&#34;&gt;SCTP&amp;nbsp;association&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;能够保持空闲状态的最长时间。超时就会被关闭。&lt;/span&gt;
  &lt;/p&gt;
&lt;/div&gt;</description>
    </item>
    <item>
      <title>Unix网络编程.第五，六章笔记.</title>
      <link>https://ykyi.net/?p=284/</link>
      <pubDate>Sat, 10 Dec 2011 13:56:00 +0000</pubDate>
      <guid>https://ykyi.net/?p=284/</guid>
      <description>&lt;p&gt;# Unix世界里经常看到的 pst  是 pseudo terminal 的意思啊。&lt;/p&gt;
&lt;p&gt;# ps -t pts/6 -o pid,ppid,tty,stat,args,wchan&lt;/p&gt;
&lt;p&gt;ps 命令的进程状态。 S表示进程在睡眠，I表示进程在等待输入，O表示进程在等待输出。当进程在S状态时，wlan指示了更详细的状态信息。&lt;/p&gt;
&lt;p&gt;# SIGSTOP 和 SIGKILL 两个posix信号不可以被caught.&lt;/p&gt;
&lt;p&gt;# 缺省情况下，Unix的信号是不排在队列中的。这意味着多个相同signal到达的时候如果没有来得及处理，就只会记下一个signal.如果需要稳定的信号支持，就要使用RealTime Posix接口。&lt;/p&gt;
&lt;p&gt;# init 进程的PID是 1.&lt;/p&gt;
&lt;p&gt;# 可以用sigprocmask函数block和unblock信号。This let us protect a critical region of code by preventing certain signals from being caught while that region of code is executing.&lt;/p&gt;
&lt;p&gt;# 对于 Unix System V 和 Unix98, the child of a process does not become a zombie if the process sets the disposition of SIGCHLD to SIG_IGN. unfortunately, tis works only under System V &amp;amp; Unix98. Posix明确指票这个行为是未定义的。The portable way to handle zombies is to catch SIGCHILD &amp;amp; call wait or waitpid.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
