🔌 第一章 浏览器生成消息
📄 一句话概括

connect(描述符, 服务器IP, 端口号) 三样参数各管一样;接通的动作是两边互发控制信息——IP 找到哪台机器,端口找到机器上哪个程序。

📝 本节和前面几节的关系

1.4.2 有了管道两头的口;本篇把两头接上——控制信息先行。

一、三样参数

描述符=用哪个本端套接字;服务器 IP=另一端在哪家; 端口号=那家屋里找哪扇门。三者缺一不可。

二、接通=互发控制信息

客户端说【我要连你的 80】,服务器回【行,连上了】; 之后双方套接字里都记着对方——管道成形。 端口的必要性:服务器上跑着 Web、邮件等多个程序, 没有端口就不知道把管道递给谁。

三、动手 Demo:connect 把管道接上

三参数各司其职,一张表说清:

for p, ex, mean in [('描述符','3','用哪个本端套接字'),
                  ('服务器IP','172.20.1.1','管道另一端在哪家'),
                  ('端口号','80','那家屋里找哪扇门')]:
    print('%-9s %-12s %s' % (p, ex, mean))

实跑输出:

--------------------------------------------------------------------
connect 把管道接上
--------------------------------------------------------------------
  connect(描述符, 服务器IP, 端口号) 三样参数各管一样:

  参数          例子           告诉协议栈什么
  ----------------------------------------------
  描述符        3              用哪个本端套接字
  服务器 IP     172.20.1.1     管道另一端在哪家
  端口号        80             那家屋里找哪扇门
  ----------------------------------------------

  接通的动作 = 两边互发控制信息:
  客户端说【我要连你的 80】,服务器回【行,连上了】——
  之后两边的套接字里都记着对方,管道成形,数据随时能走。

  IP 找到【哪台机器】,端口找到【机器上哪个程序】——
  缺一不可。

对照 1.2.4 的 DNS 查询:它连的端口是 53—— 同一台 DNS 服务器,门牌不同而已。

30 秒实验

  1. telnet 一台主机的 80 和 443,感受【连上】与【拒绝】的区别。
  2. 连一个没开监听的端口,看报错(连接被拒)。
  3. 想想 IP+端口和【门牌+房间号】的类比哪里像、哪里不像。

常见误区

  1. 以为 IP 就够定位程序——端口才区分机器上的不同程序。
  2. 以为 connect 发的是数据——先走控制信息,数据是下一步。
自测三问(点开对答案) 1. connect 的三个参数分别是什么? —— 描述符、服务器 IP、端口号。 2. 为什么需要端口号? —— 区分服务器上跑的多个程序。 3. 【接通】的实质是什么? —— 两边互发控制信息,互相记住对方。

相关笔记