前言:

准备一下计网相关面试题。那么如果写上熟悉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支持一对一、一对多、多对一、多对多的交互通信

2. 三次握手

计算机网络相关-TCP/IP协议

第一步:客户的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/IP协议
 

 

 

 

相关文章: