基础网络概念(五)TCP/IP传输层相关封包与数据、TCP三次握手

版权声明:本文为博主原创文章,转载请注明出处及原文链接。 https://blog.csdn.net/congyihao/article/details/41946577

声明:本文为笔者复习计算机网络相关知识时的摘录,文章中的图片及语句均出自《鸟哥的Linux私房菜》,这里仅作为整理自用。

喜欢鸟哥文章的朋友可以到鸟哥的主页查看:http://linux.vbird.org/


TCP/IP 的传输层相关封包与数据
网络层的 IP 封包只负责将数据送到正确的目标主机去,但这个封包到底会不会被接受,或者是有没有被正确的接收,  那就不是 IP 的任务啦!那是传送层的任务之一。

2.4.1 可靠联机的 TCP 协议
在网络层的 IP 之上则是传送层,而传送层的数据打包成什么? 最常见的就是 TCP 封包了。这个 TCP 封包数据必须要能够放到 IP 的数据袋当中才行!将 MAC, IP 与 TCP 的封包数据这样看:


想当然尔,TCP 也有表头数据来记录该封包的相关信息啰?没错啦~ TCP 封包的表头是长这个样子的:



上图就是一个 TCP 封包的表头数据,各个项目以 Source Port, Destination Port 及 Code 算是比较重要的项目。

Source Port & Destination Port (来源端口 & 目标端口)什么是埠口(port)?我们知道 IP 封包的传送主要是藉由 IP 地址连接两端,但是到底这个联机的通道是连接到哪里去呢?没错!就是连接到 port 上头啦!举例来说,鸟哥的网站有开放 WWW 服务器,这表示鸟站的主机必须要启动一个可以让 client 端连接的端口,这个端口就是 port (中文翻译成为埠口)。同样的,客户端想要连接到鸟哥的鸟站时,就必须要在 client 主机上面启动一个port ,这样这两个主机才能够利用这条『通道』来传递封包数据喔!这个目标与来源 port 的纪录,可以说是 TCP 封包上最重要的参数了!

Code (Control Flag, 控制标志码)
当我们在进行网络联机的时候,必须要说明这个联机的状态,好让接收端了解这个封包的主要动作。  这可是一个非常重要的句柄喔!这个字段共有 6 个 bits ,分别代表 6 个句柄,若为 1 则为启动。分别说明如下: 
URG(Urgent):若为 1 则代表该封包为紧急封包, 接收端应该要紧急处理,且图 2.4-1 当中的 Urgent Pointer 字段也会被启用。
o    ACK(Acknowledge):若为 1 代表这个封包为响应封包,  则与上面提到的 Acknowledge Number 有关。
o    PSH(Push function):若为 1 时,代表要求对方立即传送缓冲区内的其他对应封包,而无须等待缓冲区满了才送。 
o    RST(Reset):如果 RST 为 1 的时候,表示联机会被马上结束,而无需等待终止确认手续。这也就是说, 这是个强制结束的联机,且发送端已断线。
o    SYN(Synchronous):若为 1,表示发送端希望双方建立同步处理,  也就是要求建立联机。通常带有 SYN 标志的封包表示『主动』要连接到对方的意思。
o    FIN(Finish):若为 1 ,表示传送结束,所以通知对方数据传毕,  是否同意断线,只是发送者还在等待对方的响应而已。

其实每个项目都很重要,不过我们这里仅对 ACK/SYN 有兴趣而已,这样未来在谈到防火墙的时候,你才会比较清楚为啥每个 TCP 封包都有所谓的『状态』条件!那就是因为联机方向的不同所致啊


通讯端口口
在上图的 TCP 表头数据中,最重要的就属那 16 位的两个咚咚,亦即来源与目标的端口口。由于是 16 位,因此目标与来源端口口最大可达 65535 号 (2 的 16 次方)!那这个埠口有什么用途呢?上面稍微提到过,网络是双向的,服务器与客户端要达成联机的话, 两边应该要有一个对应的埠口来达成联机信道,好让数据可以透过这个信道来进行沟通。
那么这个埠口怎么打开呢?就是透过程序的执行!举例来说,鸟哥的网站上,必须要启动一个 WWW 服务器软件, 这个服务器软件会主动的唤起 port 80 来等待客户端的联机。你想要看我网站上的数据,就得要利用浏览器, 填入网址,然后浏览器也会启动一个埠口,并将 TCP 的表头填写目标端口口为 80 ,而来源端口口是你主机随机启动的一个埠口,  然后将 TCP 封包封装到 IP 后,送出到网络上。等鸟站主机接收到
你这个封包后,再依据你的埠口给予回应。
这么说你或许不好理解,我们换个说法好了。假如 IP 是网络世界的门牌,那么这个埠口就是那个门牌号码上建筑物的楼层!  每个建筑物都有 1~65535 层楼,你需要什么网络服务,就得要去该对应的楼层取得正确的资料。但那个楼层里面有没有人在服务你呢? 这就得要看有没有程序真的在执行啦。所以,IP 是门牌, TCP 是楼层,真正提
供服务的, 是在该楼层的那个人 (程序)!
Tips:
曾经有一个朋友问过我说:『一部主机上面这么多服务,那我们跟这部主机进行联机时,该主机怎么知道我们要的数据是 WWW 还是FTP 啊?』就是透过埠口啊!因为每种 Client 软件他们所需要的数据都不相同,例如上面提到的浏览器所需要的数据是 WWW ,所以该软件默认就会向服务器的 port 80 索求数据;而如果你是使用filezilla 来进行与服务器的 FTP 数据索求时, filezilla 当然预设就是向服务器的 FTP 相关埠口 (预设就是 port 21) 进行连接的动作啦!所以当然就可以正确无误的取得 Client 端所需要的数据了。再举个例子来说,一部主机就好像是一间多功能银行,该银行内的每个负责不同业务的窗口就好像是通讯端口口,  而我们民众就好像是 Client 端来的封包。当你进入银行想要缴纳信用卡账单时,  一到门口服务人员就会指示你直接到该窗口去缴纳,当然,如果你是要领钱,服务人员就会请你到领钱的窗口去填写数据,  你是不会跑错的对吧! ^_^。万一跑错了怎么办?呵呵!当然该窗口就会告诉你『我不负责这个业务,你请回去!』, 呵呵!所以该次的联机就会『无法成功』咯!

特权埠口 (Privileged Ports)
你现在了解了埠口的意义后,再来想想,网络既然是双向的,一定有一个发起端。问题是,到底要联机到服务器取得啥玩意儿? 也就是说,哪支程序应该在哪个端口口执行,以让大家都知道该埠口就是提供哪个服务,如此一来,才不会造成广大用户的困扰嘛!  所以啰, Internet 上面已经有很多规范好的固定 port (well-known port),  这些 port number 通常小于 1024 ,且是提供给许多知名的网络服务软件用的。 在我们的 Linux 环境下,各网络服务与port number 的对应默认给他写在 /etc/services 档案内喔! 底下鸟哥列出几个常见的 port number 与网络服务的对应:


另外一点比较值得注意的是,小于 1024 以下的埠口要启动时, 启动者的身份必须要是 root 才行,所以才叫做特权埠口嘛!这个限制挺重要的,大家不要忘记了喔!不过如果是 client 端的话,由于 client 端都是主动向 server 端要数据, 所以client 端的 port number 就使用随机取一个大于 1024 以上且没有在用的 port number

Socket Pair
由于网络是双向的,要达成联机的话得要服务器与客户端均提供了 IP 与埠口才行。因此,我们常常将这个成对的数据称之为 Socket Pair 了! 
    来源 IP + 来源埠口 (Source Address + Source Port)
    目的 IP + 目的埠口 (Destination Address + Destination Port)
由于 IP 与埠口常常连在一起说明,因此网络寻址常常使用『 IP:port 』来说明,例如想要连上鸟哥的网站时,  正确的鸟哥网站写法应该是:『 linux.vbird.org:80 』才对!

2.4.2 TCP 的三向交握
TCP 被称为可靠的联机封包,主要是透过许多机制来达成的,其中最重要的就是三向交握的功能。 那么如何藉由 TCP 的表头来确认这个封包有实际被对方接收,并进一步与对方主机达成联机? 我们以底下的图示来作为说明。


在上面的封包连接模式当中,在建立联机之前都必须要通过三个确认的动作, 所以这种联机方式也就被称为三向交握(Three-way handshake)。  那么我们将整个流程依据上面的 A, B, C, D 四个阶段来说明一下:
    A:封包发起
当客户端想要对服务器端联机时,就必须要送出一个要求联机的封包,此时客户端必须随机取用一个大于 1024 的端口来做为程序沟通的接口。然后在TCP 的表头当中,必须要带有 SYN 的主动联机(SYN=1),并且记下发送出联机封
包给服务器端的序号 (Sequence number = 10001) 。 
    B:封包接收与确认封包传送
当服务器接到这个封包,并且确定要接收这个封包后,就会开始制作一个同时带有 SYN=1, ACK=1 的封包,  其中那个 acknowledge 的号码是要给 client 端确认用的,所以该数字会比(A 步骤)里面的 Sequence 号码多一号 (ack = 10001+1 = 10002), 那我们服务器也必须要确认客户端确实可以接收我们的封包才行,所以也会发送出一个 Sequence (seq=20001) 给客户端,并且开始等待客户端给我们服务器端的回应喔!
    C:回送确认封包
当客户端收到来自服务器端的 ACK 数字后 (10002) 就能够确认之前那个要求封包被正确的收受了, 接下来如果客户端也同意与服务器端建立联机时,就会再次的发送一个确认封包 (ACK=1) 给服务器,亦即是 acknowledge = 20001+1 = 20002 啰。
    D:取得最后确认
若一切都顺利,在服务器端收到带有 ACK=1 且 ack=20002 序号的封包后,就能够建立起这次的联机了。
也就是说,你必须要了解『网络是双向的』这个事实! 所以不论是服务器端还是客户端,都必须要透过一次 SYN 与 ACK 来建立联机,所以总共会进行三次的交谈!  在设定防火墙或者是追踪网络联机的问题时,这个『双向』的概念最容易被忽略, 而常常导致无法联机成功的问题啊!切记切记!
Tips:
鸟哥上课谈到 TCP 最常做的事就是,叫一个同学起来,实际表演三
向交握给大家看!
1. 鸟哥说:A 同学你在不在?
2. A 同学说:我在!那鸟哥你在不在?
3. 鸟哥说:我也在
此时两个人就确认彼此都可以听到对方在讲啥,这就是可靠联机啦!
展开阅读全文

没有更多推荐了,返回首页