网络(Networks)、包(Packets)和协议(Protocols)

Network

计算机网络由通过通信信道(communication channerls)相互连接的机器组成。这些机器也叫作主机(hosts)路由器(routers)

通信信道,在这里指将一系列字节从一个主机转移到另一个主机的一种工具。可以是有线的,比如以太网(Ethernet);可以是无线的,比如WiFi;或者是其他的连接方式。

主机是运行应用(诸如浏览器、QQ等应用)的计算机。运行在主机上的应用程序是该网络真正的“用户”

路由器是具有将信息(information)从一个通信信道转播(relay)或转发(forward)到另一个通信信道功能的机器。他们可能会运行程序,但通常不会运行应用程序。

Packet

信息指的是被程序构造和解译的一系列字节。在计算机网络中,这些字节通常被称为包(packets) 。一个包包含能够用于完成计算机网络的任务的控制信息(control information),有时还包含用户数据。比如,包含用于识别包需要到达的目的地的信息。路由器可以使用这些控制信息来找出怎样转发每一个包。

Protocol

协议是关于通信程序之间包交换以及包的含义的规则。协议指定了包的组成,(比如,目的地的信息在包中的位置以及大小)以及信息该如何被解译。

通常,不同的协议用来解决不同的问题。比如HTTP协议(HyperText Transfer Protocol超文本传输协议)是用来解决超文本对象的传输问题的。

TCP/IP协议

概念

实现一个有用的网络,需要解决大量不同的问题。为了让事情变得易于管理和模块化,需要设计不同的协议来解决一类的问题。TCP/IP就是这样一个解决集合(collection of solutions),有时也叫作协议套件(Protocol suite)。

此后,提及网络,都指的是使用TCP/IP协议套件的网络。

TCP/IP协议套件中最主要的协议是 Internet Protocol (IP), the Transmission Control Protocol (TCP,用户传输协议) , User Datagram Protocol (UDP,用户数据报协议)。

分层

TCP/IP和其他所有协议套件都被分层(layer)了。

如图,展示了在主机和路由器上,协议、应用程序以及Sockets API之间的关系,也展示了从一个应用程序(使用TCP)发送到另一个应用程序的数据的流向。应用程序通过SocketsAPI获得TCP和UDP提供的服务。

A TCP/IP network

在TCP/IP协议中,最底层是由底层通信信道组成的(比方说以太网或者是拨号上网调制解调器连接)。这些信道被上一层的网络层所使用,网络层主要解决的问题是将包转发到他们的目的地(也就是路由器的功能);网络层主要的协议是IP协议,它使得两台主机之间就好像是单一的host-to-host信道,即使这两台主机之间存在许多的通信信道和路由器。

IP协议提供了数据报datagram服务:每一个包都是被网络单独发送出去的,因此每一个IP包必须包含目的地址信息。IP协议是最有效协议:它尝试发送每一个包。但是在网络中传递的时候,也会偶尔丢包,重新排列包,或是复制包。

网络层之上是传输层(transport layer),该层有两种协议可以选择:TCP或是UDP。两者都建立在IP协议提供的服务上,但根据应用需求不同,可以选择不同的协议。两者有一个共同的功能:寻址addressing。IP发送包给主机,但在主机需要更细分,因为一个主机可能运行了多个应用程序,需要决定应该把包发送给哪一个应用程序。TCP和UDP使用的地址,称作端口号port numbers。TCP/IP叫作端到端传输协议(end-to-end transport protocols),因为它们总是将数据从一个应用程序传递到另一个应用程序。

TCP需要检测和恢复,可能在IP协议提供的host-to-host信道中出现的:丢包,复制包或是其他错误。TCP提供了一个可信字节流信道reliable byte-stream channel,因此应用程序就不需要去处理上述可能出现的错误。TCP是一个连接导向协议connection-oriented protocol:在使用该协议进行通信之前,两个程序之间首先要建立TCP连接,这其中还包含了两台通信的计算机之间进行的握手信息的交换。

  • 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可
    靠。

    • 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
    • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
    • 第三次握手,客户端再次向服务器端发送确认信息,确认连接。整个交互过程如下图所示。

      三次握手

      UDP则不检测IP阶段可能发生的错误,因此使用UDP协议的应用需要来检查和恢复出现的错误。

地址

When you mail a letter, you provide the address of the recipient in a form that the postal
service can understand. Before you can talk to someone on the phone, you must supply a
phone number to the telephone system. In a similar way, before a program can communicate
with another program, it must tell the network something to identify the other program. In
TCP/IP, it takes two pieces of information to identify a particular program: an Internet address,
used by IP, and a port number, the additional address interpreted by the transport protocol
(TCP or UDP).

IP

网络地址是二进制数字。根据IP协议版本的不同,分为IPV4地址和IPV6地址。在技术上来说,每个网络地址指的是一个主机和底层通信信道之间的连接,即网络接口network interface。一个主机可能有多个接口。

每个版本的IP协议,定义了一些特殊用途的地址:

  • 回送地址loopback address:通常分配了一个特定的回送接口loopback interface。一个虚拟的设备会将传送包发送回本地。主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,协议软件立即返回之,不进行任何网络传输。
  • 对于IPV4来说,还存在用于私有网络的保留地址。
  • 链路本地地址link-local:这样的地址只能用于连接同一网络的主机之间的通信,路由器不会转发它们。
  • 组播地址multicast address:一般的IP地址(称为单播地址unicast)只指向单一目的地,组播地址则指向多个目的地。

IPV4

IPV4地址长32位(bits),4个字节(bytes)。IPV4地址可以使用点分法(dotted-quad)来书写,每一组数字代可以是十进制数字,代表一个字节,比如:10.1.2.3。每一位的取值范围是0-255。

IPV4的回送地址是127.0.0.1.严格来说任何127开头的地址都能回送。

IPV4用于私有网络的保留地址包括10开头和192.168开头的所有地址,以及172开头,第二位为16和31的所有地址。

IPV4的链路本地地址以169.254开头。

IPV4的组播地址包含从224开头的地址到239开头的地址。

IPV6

IPV6地址长128位(bits),16个字节(bytes)。IPV6地址使用十六进制数字来书写,每组数字代表2个字节,组与组之间用冒号隔开,比如2000:fdb8:0000:0000:0001:00ab:853c:39a1。前导0可以省略,比如:2000:fdb8:0000:0000:1:ab:853c:39a1。连续的只包含0的组可以一起省略(但只能省略一次),比如2000:fdb8::1:00ab:853c:39a1

IPV6的回送地址是0:0:0:0:0:0:0:1,或者简写为::1

IPV6的链路本地地址以FE8开头。

IPV6的组播地址以FF开头。

端口号

TCP或是UDP的端口号通常跟一个地址相关联。

The postal service uses the street address to get the
letter to a mailbox; whoever empties the mailbox is then responsible for getting the letter to the
proper room within the building. Or consider a company with an internal telephone system:
to speak to an individual in the company, you first dial the company’s main phone number to
connect to the internal telephone system and then dial the extension of the particular telephone
of the individual you wish to speak with.

the Internet address is the street address or the company’s main number, whereas the port corresponds to the room number or telephone extension.

端口号是16位的无符号二进制数字,其范围是1-65535(0号端口被保留)。

名称

我们已经习惯将一个名称(比如host.example.com)指向相应的主机。但是IP协议处理的是地址(二进制数字),而不是名称。

我们需要使用域名系统Domain Name System (DNS)和本地配置的数据库,来将域名和IP地址联系起来。

服务端&客户端

客户端程序初始化通信,服务端程序被动的等待并且回复与它进行通信的客户端程序。服务端和客户端组成了应用。

一个程序是作为客户端还是服务端,决定了其使用sockets API来与其对等方(peer)进行通信的一般形式。(客户端是服务端的对等方,反之亦然)。因此,辨别服务端和客户端就很重要了,因为,客户端需要知道服务端的地址和端口号以便初始化通信。但是反过来不成立,因为通过sockets API,服务端在接收到客户端的初始化通信时便能够获取到客户端的地址信息

in order to
be called, a person does not need to know the telephone number of the caller. As with a
telephone call, once the connection is established, the distinction between server and client
disappears.

那么客户端又怎么能知道服务端的IP地址和端口号呢?通常,客户端知道他想要进行通信的服务端的名字即可。比方说,通过统一资源定位符Universal Resource Locator (URL),诸如https://www.baidu.com此形式,然后再通过DNS即可知道相应的服务端的IP地址。

想要知道服务端的端口有点不同。理论上,服务端会使用任意的端口号,但是客户端又必须找到他。对一些特定的服务,规定了一些特定的端口号。比如,端口号21分配给了文件传输协议File Transfer Protocol (FTP)

什么是Socket

A socket is an abstraction through which an application may send and receive data,A socket allows an application to plug in to the network and communicate with other applications that are plugged in to the same network. Information written to the socket by an application on one machine can be read by an application on a different machine and vice
versa.

不同类型的套接字与不同类型的协议套件以及协议套件中的不同协议栈相关联。

TCP/IP中主要的套接字类型是stream socketsdatagram socketsstream sockets使用TCP作为端到端协议(底层通过IP协议),因此提供了一个可信赖的字节流(byte-stream)服务。一个TCP/IP stream socket代表了TCP连接的一端。datagram sockets使用的是UDP协议(底层通过IP协议),因此提供了一个最优数据报服务(best-effort datagram service),使得应用可以单次发送大约65500字节的信息。

Sockets, protocols, and ports

Figure 1.2 depicts the logical relationships among applications, socket abstractions,
protocols, and port numbers within a single host. Note that a single socket abstraction can
be referenced by multiple application programs. Each program that has a reference to a particular socket can communicate through that socket. Earlier we said that a port identifies an
application on a host. Actually, a port identifies a socket on a host. From Figure 1.2, we see
that multiple programs on a host can access the same socket. In practice, separate programs
that access the same socket would usually belong to the same application (e.g., multiple copies
of a Web server program), although in principle they could belong to different applications.