目录
2.2 为什么第三部中ack = y+1?那些报文段内容是什么呢?
前言:
准备一下计网相关面试题。那么如果写上熟悉TCP/IP协议呢?我需要掌握到什么程度呢?
在没有准备之前,我脑海里面能想到的只有TCP/IP的三次握手 四次挥手。
OSI的七层模型。其他好像没了。
先整理一下TCP/IP的内容吧。
之前买了本《图解TCP/IP》,这次挑重点在整理一下。毕竟TCP几乎是必问的基础项。
提到TCP也可以适当引导一下MQ的原理,毕竟MQ用的是一个TCP连接多个信道。
1.TCP
1.1 TCP协议的特点?
按照王道考研书上的答案:
TCP是在不可靠的IP层之上实现的可靠的数据传输协议。主要是:可靠,有序,无丢失,并不重复的问题。
主要特点:
1)面向连接
2)TCP一对一
3)可靠,无丢失不重复
4)全双工通信,允许通信双方应用程序任何时候都可以进行发送数据,所以TCP连接的两端都有发送缓存和接受缓存。(这点忘记了)
5)TCP是面向字节流的,虽然应用程序和TCP的交互是一次一个数据块(大小不等)。
TCP把应用程序交下来的数据仅仅是一连串无结构的字节流。
1.2 TCP与UDP的区别?
1) TCP是面向连接的,可靠性高;UDP是基于非连接的,可靠性低
2) 由于TCP是连接的通信,需要有三次握手、重新确认等连接过程,会有延时,实时性差,同时过程复杂,也使其易于攻击;UDP没有建立连接的过程,因而实时性较强,也稍安全
3) 在传输相同大小的数据时,TCP首部开销20字节;UDP首部开销8字节,TCP报头比UDP复杂,故实际包含的用户数据较少。TCP在IP协议的基础上添加了序号机制、确认机制、超时重传机制等,保证了传输的可靠性,不会出现丢包或乱序,而UDP有丢包,故TCP开销大,UDP开销较小
4) 每条TCP连接只能时点到点的;UDP支持一对一、一对多、多对一、多对多的交互通信
1.3 tcp报文段
TCP传送的数据单元叫做报文段,TCP包括了TCP首部和TCP数据两部分。
整个TCP作为IP数据报的数据部分封装在IP数据报中。
20个字节固定的,TCP首部最短为20个字节,后面有4N字节根据需要而增加,通常长度是4字节的整数倍。
如图所示。
1.4 TCP各字段意义
1)源端口和目的的端口字段:各占两个字节,端口是运输层和应用层的服务接口,运输层的复用和分用都要通过端口才能实现。
(一说到这个,想起以前写的一个负载均衡的博文,其中就有源端口和目标端口相关内容。。回头翻一下)
2)序号字段: 四个字节TCP是面向字节流的,也就是TCP传输的时候是一个字节一个字节的传送的。所以TCP要给连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值是本报文所发送的数据的第一个字节的序号。
比如:一报文的序号字段是301,携带的数据共有100字节,这就说明本报文的数据的最后一个字节的序号是400,故下一个报文段的序号应该从401开始。
3)确认号字段:4个字节,期待收到对方的下一个报文段的数据的第一个字节的序号,因为后续字节是按照顺序递增的。
至于后面三次握手中的确认位:也是跟上面的面向字节流相关。对于确认位:
比如B正确接收到A的报文段,序号字段是501,数据长度是200字节,那么表示B正确接收到了A的到序号700为止的数据,那么B期待A下一个数据编号是701,所以发送过去的ack = 701
4)数据偏移 (首部长度) 占4个字节,这不是IP数据报分片的那个数据偏移,而是代表首部的长度,指出TCP数据的起始处距离TCP的报文头的起始处多远。(就是单纯头部多大)
5)保留字段 占6位,保留今后使用
6)ACK:这是保留位中的确认位。只有当ACK=1 确认号字段才有效。当ACK=0,确认号没有效。
7)推送位 PSH(push) :接受TCP收到PSH=1的报文段,就尽快的交付接收应用进程,而不等到整个缓存填满了再向上交付。
8)紧急位URG: 当URG=1,表示紧急指针字段有效。告诉系统这个报文段中有紧急数据,应该尽快传达。URG应该配合紧急指针一起使用,也就是数据从第一个字节到紧急指针的所有字节是紧急数据。
9)复位位RST:当RST=1,TCP连接中出现严重错误,比如主机崩溃等等,必须要释放连接,重新建立。(这个跟丢包有关系吗??)
10)同步位SYN: SYN表示这是一个连接请求或者连接接收报文
当SYN=1,ACK=0比如三次握手的第一步骤,说明是请求连接报文。
当对方同意接收连接,响应报文用SYN=1,ACK=1(也就是连接建立成功之后,就不在为1了)、
11)FIN终止位:释放连接,表示此报文的发送方的数据已经发送完毕,请求释放传输连接。
12) 窗口字段:2个字节,指出现在允许对方发送的数据量。
接收方的数据缓存空间是有限的,所以用窗口值来座位接收方让发送方设置其发送窗口的依据,单位为字节。(大概就是要发送多少数据最多能发多少的依据)
13) 校验和:两个字节,检验和字段检验范围包括首部和数据这两部分。计算校验和的时候,要和UDP一样,在TCP报文段的前面加上12字节的伪首部
14)紧急指针字段:16位,紧急数据放在本报文段数据的最前面,指的是到哪里是紧急数据
15)选项字段:长度可以变化。TCP只规定了最大长度,MSS。(MAX SEGMENT SIZE)
16) 填充字段:让整个头部为4的整数倍字节。
2. 三次握手
第一步:客户的TCP首先向S端发送链接请求保温段。(不包含应用层数据,首部的SYN标志位为1)
客户端会随机选择一个其实序号seq =x(消耗掉一个序号)
第二步:S端TCP请求接收到连接报文,如果同意的话,向客户端发回确认,并为该TCP连接分配TCP缓存和变量。
再确认报文中,SYN和ACK位都被置为1.确认号字段值为为ack = x+1,服务器随机生成一个其实序号seq = y
确认报文不携带应用层数据,但是需要消耗一个序号。
第三步: 当客户机收到确认报文段后,还要向服务器给确认,并且应该给该连接分配缓存和变量。
这个报文段ACK = 1, 序号字段为x + 1,确认号字段ack = y+1,该报文段可以携带数据,如果不携带数据则不消耗序号。
2.1 TCP在哪一步就可以发送数据了?
印象中之前有人问过我,我这个答得不对。是在第三个阶段,就可以携带数据了。
如果不携带数据就不消耗序号。
2.2 为什么第三部中ack = y+1?那些报文段内容是什么呢?
这点很重要,如果不理解很难硬记下来。
ack 用对方上一次消息中的seq 顺序号 +1, 目的是为了确保建立连接的双方都是真实的对方,而不是被中间人冒充的。
ack和seq都是整型变量;
ACK = 1 这个用来表示应答包,而序列号在连接的任何时候都存在,用来校验包的顺序性。
服务器端的资源是在完成第二次握手时候分配的,客户端的资源是在完成第三次握手分配的。(见上方红字)
但是这样可能会使得服务器容易受到SYN洪泛攻击。
2.3 为什么需要三次握手?
因为比如A端client 向B端发送建立连接的请求。但是A因为网络原因或者其他原因出现了问题,产生了错误,或者在某个网络节点发生滞留,导致了A延迟到连接释放之后某个时间段才到了B。
相当于A已经抛弃这次简历连接的请求了,认为没有发送成功,但是实际因为一些原因后来到了B
但是A已经不想要这次连接了,B却认为A想要建立连接,然后发送给A同意建立连接的请求。
如果没有三次握手的话,那么B发送完确认请求之后,就认为建立成功了,但是A端没有认为建立成功,
也就不会发送数据给B。就浪费了资源。
在《计算机网络》一书中,三次握手的目的是“为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误。
3.TCP四次挥手
tcp释放C S谁都可以去终止连接。 主动发起请求的是Client。
第一步:客户机关闭连接。发送一个FIN=1,seq=u的请求,就是之前建立数据交互之后的最后一个数据序号+1;
FIN即使不携带数据也要消耗一个序号。当发送FIN之后,发送FIN的一端就不能够在发送数据了。
因为是全双工的。需要双方都断掉才行。
第二步:服务器收到,发出确认。ACK=1,seq=v,ack=u+1.这个V是server发送的最后一个数据+1.
那么客户端->服务端这个方向的连接释放了。
第三步:若服务器没有向客户端发送的数据了,那么也断开连接,FIN=1,ACK=1,seq=w,ack=u+1 (因为客户端一直没有
发送消息了,所以ack位期待着客户端在发送消息应该是u+1,因为客户端在此之前没再发送请求啦)
第四步:客户端回执:ACK=1,seq=u+1,ack=w+1.
seq是控制自己那一方数据的顺序的。而seq也得根据对方的ack来进行填写,因为是双方进行校验。
ack是对方传来的seq+1,其实就是期待着对方下一次给我们传来什么序号作为开始的第一个数据字节的序号。
4.TCP的连接管理(关于套接字)
TCP的连接的端点不是主机
而是套接字(端口)socket或者称作插口,端口拼接到IP地址构成了套接字。
每一条TCP连接唯一的被通信两端的两个套接字所确定。
TCP采用C/S方式,主动发起建立连接的是Client
被动的叫做server。
如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。
就相当于我们的端口。