浅谈传输层协定(一):TCP 在做什麽?

前面提到 TCP/IP 模型,TCP 和 IP 两个协定可说是现今网路架构的最重要的协定之二。

TCP 在 OSI 及 TCP/IP 模型中都是属於传输层的协定,而在传输层其实也有另一个广泛被使用的协定,叫做 UDP(User Datagram Protocol,使用者资料报协定),做的事情略有不同。

聊完了 IP 之後,我们接着来看看这两大传输层协定,先从 TCP 开始。

TCP 在做什麽?

回顾一下 TCP 的全称:Transmission Control Protocol 传输控制协议,这个协定故名思义就是在控制传输的大小事。

在 IP,网路层这个阶段,基本上只管我从哪来、我往哪去?但是封包不见了、里面的资料坏掉了,IP 一概不管。这时候 TCP 就起到至关重要的作用了!确保连线的可靠性就是其主要任务,它有一系列的手段去确保资料能够送到对方手中,

IP 不可靠的部分,就留给 TCP 做了,包括确保资料抵达目的地、资料的顺序一致(这是由於一份资料可能会被切成数份传送)、资料没有损坏、流量的控制等等。

TCP 连线及连接埠

TCP 会在两个端点间建立一个连线(称做 Socket Connection)来确保双方的沟通顺畅,就像是一条电话专线一样。在这个连线之中,会在来源及目的各指定一个连接埠(Port),作为确认这个连线的编号。

由於 TCP 是基於 IP 的上面一层,TCP 的连线都会在同一个 IP Address 下,可以理解为都与同一台设备进行连线。但两个设备间的连线可能不只一个,就会需要编号来分开不同的连线。用 Port(港口,计算机领域译成连接埠)来命名编号,就像是在同一个地区(同一个 IP Address)有不同的港口。

TCP Socket Connection
*TCP Socket Connection

例如在 IP 位置为 87.65.43.21 的服务器中开了一个 Port 80,这是服务器专门为 HTTP 开的 Port,服务器会一直等待新的封包进来,看看有没有 TCP 协定要传的内容,Port 是指定 80 的,而这个等待连线产生的行为就被称为监听(Listen)。

IP 位置为 12.34.56.78 也是一台装置,可能自己也有启动一些服务,也有架设网站,因此也会监听自己的 Port 80。但当这台装置也想连到另一台装置使用对方 HTTP 服务的时候,它会找一个目前没有在用的 Port,如 12345(总之不能是现在有开的 22, 80 Port),当作来源,和对方的 Port 80 建立合法的 TCP 连线。

Port 的数字大小必须介於 1-65535 间,因为 TCP 要存放来源及目的 Port 的长度只有 16 bits 而已。一些常用的服务都会被保留起来,例如 HTTP 这个应用层的服务通常都是 80、SSH 都是 22 等等,这是约定俗成的定义,也就是说如果你想,你也可以占用这些 Port 去启用你自己的网路服务。

TCP 如何建立连线?三向交握

要建立可靠的连线,TCP 提出的办法是我知道你知道我知道,很饶舌吧!这个建立连线的方法称做「三向交握」(Three-way handshake),原理其实很简单,就是先丢个讯息和对方确认,对方回答,我们再做最後回应。

TCP 三向交握
*TCP 三向交握

三次传递讯息分别用来达成及确认一些事情

  1. 确认建立连线,确认我方到对方的网路是通的
  2. 回应是否建立连线(对的,有可能被对方拒绝),以及告诉我方,网路从对方来的这条路径是通的
  3. 最後让对方知道,我方到对方的路径是通的

你可能会想,第 3 次的讯息有必要吗?不是在第 1 次就让对方知道我们的讯息传的到了?

这几次交握的讯息中还藏着「序列号码」(seq, sequence number)及「确认号」(ack, acknowledgement number)。由於一笔资料可能会很大,并且 IP 这个协定有限制每个封包的最大大小,因此 TCP 用序列号码来记录被分割後的每一份小资料。

序列号码及确认号
*序列号码及确认号

有了序列号码之後,在交握同时会附带这个讯息,对方收到後的回覆则会包含「确认号」,也就是对方期待收到的下个序列号码为何,藉此来确保封包是连续的。

确认过眼神,便可以开始传输资料了,接下来,我们继续看看 TCP 如何管理资料传输。

参考资料

  1. Wiki - TCP
  2. Wiki - 通讯埠
  3. NotFalse 技术客 - TCP 三向交握

<<:  JavaScript学习日记 : Day17 - Async Await

>>:  Day13:Send Message To Room(发送讯息到特定房间)

[第十四只羊] 迷雾森林舞会VII 开完房间後走进房间

天亮了 昨晚是平安夜 关於迷雾森林故事 焦虑抑制剂 4号:我跟全场站不同边耶,我站7耶,我跟7号玩家...

Day 16 - UML x Interface — TextField

今天的 TextField 和明天的 FormControl 都是在介绍跟表单有关的介面和元件,而...

Learn How to Print Multiple Outlook Messages to PDF?

Summary: Get MSG to PDF Converter- An amazing solu...

[Day03 - 规划与设计] 建立 Wireframe 让你开发不迷路

如果不想要大家一起通灵通出一坨O,请不要偷懒做好规划。我说那个Excel写出来的功能列表也是不够的,...

Day 11:将你的 Hexo 部落格部属到 Github Pages

我相今天的篇章是大家期待已久的,因为经过前面十天的努力,今天终於要将我们的部落格公开在世人面前啦!不...