TCP/IP,C/S,B/S网络编程入门随笔

发布时间 2023-11-23 12:11:45作者: Morning枫

前言

  海投简历的时候,很多岗位都要求你掌握HTTP交互和了解TCP/IP协议,以及一些网络编程的要求,趁实习的空隙补一补

C/S和B/S

C/S(Client/Server)结构,也就是客户端和服务器结构

  也可以叫二层C/S结构,即客户机,服务机这两层结构

  例如QQ、WeChat以及游戏客户端(例如steam)这些,可统称为客户端(“胖客户端”),我们下载这些软件到本地,再通过这些客户端软件实现和服务端的通讯,像是游戏客户端负责绘制游戏世界的实时画面,服务器端则负责响应所有客户端的连接请求和游戏逻辑处理,并控制所有客户端的画面绘制,客户端与服务器通过网络数据包交互完成每一步游戏逻辑。

  它是点对点的通讯,能减少通讯的流量,节约成本,响应比较迅速。同时客户端能承担一部分的事务逻辑处理,因而减轻了服务器负担,增大了网络流量。

  但是,这种结构如果需要更新,那么就要求客户端和服务端一并更新(哪怕是微小的修改,部署也要客户端和服务端同时更新),就像我们日常生活中的软件/游戏一样(新版本更新!),防止不同客户端软件版本不一致而导致无法工作,而且对不同的操作系统,客户端要针对他们做不同的适配,这一点就比较麻烦。

B/S(Browser/Server)结构,即浏览器和服务器结构

  B/S结构属于三层C/S结构,它包含客户机(表示层),应用服务器(业务逻辑层),数据库服务器(数据存储层)

  这种结构下,采用www浏览器作为客户端,Web服务器作信息传递的角色(请求通常以SQL语句实现),数据库服务器处理请求(处理SQL语句,返回HTML文本等),它是一种多对多的结构,开发比较简单,页面更新是同步的,所有用户能实时看到效果,拓展方便,跨平台。

推荐好文:点我跳转,我个人建议先看完推荐的文再往下看,下面是文章我自己总结的内容

TCP/IP协议

什么是网络通讯协议(例如TCP/IP)

  通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时候需要遵守一定的规则,在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一的规定,通信双方必须同时遵守才能完成数据的交换。

我认为理解这个TCP/IP协议前,应该先了解OSI的七层体系结构

image
image

我们只看TCP/IP这个四层结构:
它的每一层都以呼叫它的下一层所提供的协议来完成自己的需求。

链路层(ARP、RARP): 定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。

网络层(ICMP、IP、TGMP): 是整个TCP/IP协议的核心,主要用于将传输的数据进行分组,将分组的数据发送到目标计算机或网络。

传输层(TCP/UDP): 主要负责网络通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。

应用层(HTTP/FTP/SMTP/Telnet等): 主要负责应用程序的协议,例如Http协议,FTP协议等。(比如访问网站时必须遵循https协议)。

http
我们再来看一下http协议,目前Http有1.0和1.1版本,后者为现今常用版本

  http也叫超文本传输协议,它是一种用于分布式、协作式和超媒体信息系统的 应用层 协议,同时它不对请求和响应之间的通信状态进行保存(无状态,不对请求或响应做持久化处理),它还具有长连接和短连接的特性(实质上是TCP协议的长连接和短连接)。

短连接 :HTTP/1.0默认使用,即客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断。

长连接(Keep-Alive) :HTTP/1.1默认使用,它会在响应头加入下面这个代码Connection:keep-alive,在长连接下,客户端与服务器间的TCP连接不会关闭,一定时间内客户端再次访问这个服务器时会继续使用这条TCP连接,这个一定时间可用在不同的服务器软件上设定(长连接需要客户端和服务器都支持)。

HTTP报文的传输
image

在TCP/IP中,它是这样的
image

结合物理层,就这样传输
image

TCP/UDP

TCP :面向连接,可靠的,能保证传输数据的安全(下载文件,浏览网页等),需要进行三次握手以保证连接的可靠性!(断开连接要四次挥手)。

PS:如果只使用两次握手??
  客户端向服务器端发送的请求报文A可能会因网络延迟导致滞留,此时客户端认为第一次连接请求报文A失效,客户端会再次向服务器端发送请求报文B,之后与服务器端建立连接,当连接释放后,由于网络通畅了,第一次客户端发送的请求报文A又突然到达了服务器端,这条请求报文本A按理来说是失效的,但此时服务器端误认为客户端又发送了一次连接请求,再次两次握手建立好连接,但是此时客户端忽略服务器端发来的确认,也不发送数据,就造成不必要的错误和网络资源的浪费。

三次握手(建立)

image

第一次握手(确认客户端发送能力正常):客户端向服务器端发出连接请求,等待服务器确认。

第二次握手(确认服务器端发送能力和接收能力正常):服务器端向客户端回送一个响应,通知客户端收到了连接请求。

第三次握手(确认客户端接收能力正常):客户端再次向服务器端发送确认信息,确认连接。

  相当于A给B打电话,①第一次握手是接通后,A问B听得见吗?②第二次握手是,B回答A说听得见,然后问A听不听得见。③第三次握手是A回答B说,我(A自己)也听得见,至此,TCP可靠连接就建立起来了。

PS:如果TCP连接已经建立,但是客户端(Client)出现故障?
  TCP有一个保活计时器,每收到一次客户端的的数据帧,计时器就会复位;如果在计时器计时范围内,没有收到客户端任何数据帧,服务端就会发送一个探测报文段,此后每隔一段时间(通常是75s)就再发送一次探测报文段,若连续10次发送后仍没反应,那么服务器端就会关闭TCP连接。(保活计时器时长可自定义)

四次挥手(断开)

PS:为啥要四次挥手?
  简而言之一点就是,A和B要分开,①A说:我先走了,②B说:刑,你走吧,③B又说,那我也走了?④A说:刑你走吧

image

第一次挥手:客户端发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态

第二次挥手:服务器端接收到连接释放报文后,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT 关闭等待状态

第三次挥手:客户端接收到服务器端的确认请求后,客户端就会进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

第四次挥手:客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态,但此时TCP连接还未终止,必须要经过2MSL后(2倍的最长报文寿命),当客户端撤销相应的TCB后,客户端才会进入CLOSED关闭状态,服务器端接收到确认报文后,会立即进入CLOSED关闭状态,到这里TCP连接就断开了,四次挥手完成。

PS:等待2MSL是为了保证客户端发送的第一个ACK能给服务器接收到,因为这个ACK报文可能会被丢失,1MSL是报文的最长寿命,而2MSL是任何报文在网络上的存活时间,超过2MSL的报文就会被丢弃,此举能保证新的连接中不会出现旧连接的请求报文。

报文含义(搬运)

image

报文详细含义解释 (一)源端口号 源端口号表示报文的发送端口,占16位。源端口和源IP地址组合起来,可以标识报文的发送地址。

(二)目的端口号
目的端口号表示报文的接收端口,占16位。目的端口和目的IP地址相结合,可以标识报文的接收地址。

TCP协议是基于IP协议的基础上传输的,TCP报文中的源端口号+源IP,与TCP报文中的目的端口号+目的IP一起,组合起来唯一性的确定一条TCP连接。

(三)序号(Sequence Number)
TCP传输过程中,在发送端出的字节流中,传输报文中的数据部分的每一个字节都有它的编号。序号(Sequence
Number)占32位,发起方发送数据时,都需要标记序号。

序号(Sequence Number)的语义与SYN控制标志(Control
Bits)的值有关。根据控制标志(Control Bits)中的SYN是否为1,序号(Sequence
Number)表达不同的含义:

(1)当SYN = 1时,当前为连接建立阶段,此时的序号为初始序号ISN((Initial Sequence
Number),通过算法来随机生成序号;

(2)当SYN = 0时在数据传输正式开始时,第一个报文的序号为 ISN +
1,后面的报文的序号,为前一个报文的SN值+TCP报文的净荷字节数(不包含TCP头)。比如,如果发送端发送的一个TCP帧的净荷为12byte,序号为5,则发送端接着发送的下一个数据包的时候,序号的值应该设置为5+12=17。

在数据传输过程中,TCP协议通过序号(Sequence
Number)对上层提供有序的数据流。发送端可以用序号来跟踪发送的数据量;接收端可以用序号识别出重复接收到的TCP包,从而丢弃重复包;对于乱序的数据包,接收端也可以依靠序号对其进行排序。

(四)确认序号(Acknowledgment Number)
确认序号(Acknowledgment
Number)标识了报文接收端期望接收的字节序列。如果设置了ACK控制位,确认序号的值表示一个准备接收的包的序列码,注意,它所指向的是准备接收的包,也就是下一个期望接收的包的序列码。

举个例子,假设发送端(如Client)发送3个净荷为1000byte、起始SN序号为1的数据包给Server服务端,Server每收到一个包之后,需要回复一个ACK响应确认数据包给Client。ACK响应数据包的ACK
Number值,为每个Client包的为SN+包净荷,既表示Server已经确认收到的字节数,还表示期望接收到的下一个Client发送包的SN序号,具体的ACK值如下图左边的正常传输部分所示。

image

图:传输过程的确认序号(Acknowledgment Number)值示例图

在上图的左边部分,Server第1个ACK包的ACK
Number值为1001,是通过Client第1个包的SN+包净荷=1+1000计算得到,表示期望第2个Client包的SN序号为1001;Server第2个ACK包的ACK
Number值为2001,为Client第2个包的SN+包净荷=2001,表示期望第3个Server包的SN为2001,以此类推。

如果发生错误,假设Server在处理Client的第二个发送包异常,Server仍然回复一个ACK
Number值为1001的确认包,则Client的第二个数据包需要重复发送,具体的ACK值如上图右边的正常传输部分所示。

只有控制标志的ACK标志为1时,数据帧中的确认序号ACK
Number才有效。TCP协议规定,连接建立后,所有发送的报文的ACK必须为1,也就是建立连接后,所有报文的确认序号有效。如果是SYN类型的报文,其ACK标志为0,故没有确认序号。

(五)头部长度
该字段占用4位,用来表示TCP报文首部的长度,单位是4bit位。其值所表示的并不是字节数,而是头部的所含有的32bit的数目(或者倍数),或者4个字节的倍数,所以TCP头部最多可以有60字节(4*15=60)。没有任何选项字段的TCP头部长度为20字节,所以其头部长度为5,可以通过20/4=5计算得到。

(六)预留6位
头部长度后面预留的字段长度为6位,作为保留字段,暂时没有什么用处。

(七)控制标志
控制标志(Control
Bits)共6个bit位,具体的标志位为:URG、ACK、PSH、RST、SYN、FIN。6个标志位的说明,如下表所示。

表:TCP报文控制标志(Control Bits)说明

标志位 说明
URG 占1位,表示紧急指针字段有效。URG位指示报文段里的上层实体(数据)标记为“紧急”数据。当URG=1时,其后的紧急指针指示紧急数据在当前数据段中的位置(相对于当前序列号的字节偏移量),TCP接收方必须通知上层实体。
ACK 占1位,置位ACK=1表示确认号字段有效;TCP协议规定,接建立后所有发送的报文的ACK必须为1;当ACK=0时,表示该数据段不包含确认信息。当ACK=1时,表示该报文段包括一个对已被成功接收报文段的确认序号Acknowledgment Number,该序号同时也是下一个报文的预期序号。
PSH 占1位,表示当前报文需要请求推(push)操作;当PSH=1时,接收方在收到数据后立即将数据交给上层,而不是直到整个缓冲区满。
RST 占1位,置位RST=1表示复位TCP连接;用于重置一个已经混乱的连接,也可用于拒绝一个无效的数据段或者拒绝一个连接请求。如果数据段被设置了RST位,说明报文发送方有问题发生。
SYN 占1位,在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1。 综合一下,SYN置1就表示这是一个连接请求或连接接受报文。
FIN 占1位,用于在释放TCP连接时,标识发送方比特流结束,用来释放一个连接。当 FIN = 1时,表明此报文的发送方的数据已经发送完毕,并要求释放连接。

在连接建立的三次握手过程中,若只是单个SYN置位,表示的只是建立连接请求。如果SYN和ACK同时置位为1,表示的建立连接之后的响应。

(八)窗口大小:
长度为16位,共2个字节。此字段用来进行流量控制。流量控制的单位为字节数,这个值是本端期望一次接收的字节数。

(九)校验和:
长度为16位,共2个字节。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,接收端用于对收到的数据包进行验证。

(十)紧急指针:
长度为16米,2个字节。它是一个偏移量,和SN序号值相加表示紧急数据最后一个字节的序号。

以上十项内容是TCP报文首部必须的字段,也称固有字段,长度为20个字节。接下来是TCP报文的可选项和填充部分。

(十一)可选项和填充部分
可选项和填充部分的长度为4n字节(n是整数),该部分是根据需要而增加的选项。如果不足4n字节,要加填充位,使得选项长度为32位(4字节)的整数倍,具体的做法是在这个字段中加入额外的零,以确保TCP头是32位(4字节)的整数倍。

最常见的选项字段是MSS(Maximum Segment
Size最长报文大小),每个连接方通常都在通信的第一个报文段(SYN标志为1的那个段)中指明这个选项字段,表示当前连接方所能接受的最大报文段的长度。

由于可选项和填充部分不是必须的,所以TCP报文首部最小长度为20个字节。

TCP报文首部的后面,接着的是数据部分,它是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据,比如在处理超时的过程中,也会发送不带任何数据的报文段。


———————————————— 版权声明:本文为CSDN博主「退休的汤姆」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/stone_tmp/article/details/118386484