计算机网络----常见问题之TCP篇(1)

1.TCP的头格式?
序列号:在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机,每发送一次数据,就累加一次该数据字节数的大小。用来解决网络包乱序问题。
确认应答号:指下一次期望收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决不丢包的问题。
控制位:
ACK:该位为1时,确认应答的字段变为有效,TCP规定除了最初建立连接时SYN包之外该位必须设置1.
RST:该位为1时,表示TCP连接中出现异常必须强制断开连接。
SYC:该位为1时,表示希望建立连接,并在其序列号的字段进行序列号初始值得设定。
FIN:该位为1时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为1的TCP段。
2.为什么需要TCP协议?TCP工作在那一层?
IP层是不可靠的,它保证网络包的交付,不保证网络包的按序交付,也不保证网络包中的数据的完整性。如果需要保障网络数据包的可靠性,那么就需要由上层(传输层)的TCP协议来负责。因为TCP是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏,无间隔,非冗余和按序的。
3.什么是TCP?
TCP是面向连接的,可靠的,基于字节流的传输层通信协议。
面向连接:一定是“一对一”才能连接,不能像UDP协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;
可靠的:无论网络链路中出现了怎样的链路变化,TCP都可以保证一个报文一定能够到达接收端;
字节流:消息是没有边界的,所以无论我们消息有多大都可以进行传输。并且消息是有序的,当前一个消息没有收到的时候,即使它先收到了后面的字节已经收到,那么不能扔给应用层去处理,同时对重复的报文会自动丢弃。
4.什么是TCP连接?
用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket,序列号和窗口大小称为连接。所以我们知道,建立一个TCP连接是需要客户端与服务器端达成上述三个信息的共识。
Socket:由IP地址和端口号组成
序列号:用来解决乱序问题等
窗口大小:用来做流量控制
5.如何确定一个TCP连接呢?
TCP四元组可以唯一的确定一个连接,四元组包括如下:
源地址:
源端口:
目的地址:
目的端口:
源地址和目的地址的字段(32位)是在IP头部中,作用是通过IP协议发送报文给对方主机。
源端口和目的端口的字段(16位)是在TCP头部中,作用是告诉TCP协议应该把报文发送给那个进程。
6.一个IP的服务器监听了一个端口,它的TCP最大连接数是多少?
服务器通常固定在某个本地端口上监听,等待客户端的连接请求。客户端IP和端口是可变的,公式:
最大TCP连接数=客户端IP数x客户端的端口数。
对于IPv4,客户端的IP数最多为2的32次方,客户端的端口数最多为2的16次方,也就是服务端单机最大TCP连接数远不能达到理论上限
首先主要是文件描述符限制,Socket都是文件,所以首先要通过ulimit配置文件描述符的数目;
另一个是内存限制,每个TCP连接都要占用一定内存,操作系统是有限的。
7.UDP和TCP有什么区别?分别应用的场景。
UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。
UDP协议非常简洁,头部只有8个字节头部包含:源端口,目标端口号,包长度,校验和(16位),数据。
目标和源端口:主要是告诉UDP协议应该把报文发给那个进程。
包长度:该字段保存了UDP首部的长度跟数据的长度之和。
校验和:校验和是为了提供可靠的UDP首部和数据而设计。
区别:
连接:
TCP是面向连接的传输层协议,传输数据之前要先建立连接。
UDP是不需要连接,即刻传输数据。
服务对象:
TCP是一对一的两点服务,即一条连接只有两个端点。
UDP支持一对一,一对多,多对多的交互通信
可靠性:
TCP是可靠交付数据的,数据可以无差错,不丢失,不重复,按需到达。
UDP是尽最大努力交付,不保证可靠交付数据。
拥塞控制,流量控制
TCP有拥塞控制和流量控制机制,保证数据传输的安全性。
UDP则没有,即使网络非常拥堵了,也不会影响UDP的发送速率。
首部开销:
TCP首部长度较长,会有一定的开销,首部在没有使用选项字段时是20个字节,如果使用了选项字段则会变长的。
UDP首部只有8个字节,并且是固定不变的,开销较小。
应用场景:
由于TCP是面向连接的,能保证数据的可靠性交付,因此经常用于:
FTP文件传输
HTTP/HTTPS
由于UDP面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,所以经常用于:
包总量较少的通信,DNS,SNMP等。
视频,音频等多媒体通信
广播通信
8.为什么UDP头部没有首部长度字段,而TCP却有?
因为TCP有可变长的选项字段,而TCP头部则是不会变化的,无需多一个字段去记录UDP的首部长度
9.为什么UDP头部有包长度字段,而TCP没有
负载长度计算: TCP数据长度=IP总长度-IP首部长度-TCP首部长度。
其中,IP总长度和IP首部长度,在IP首部格式是已知的。TCP首部长度,则是在TCP首部格式已知的,所以就可以求得TCP数据的长度。因为为了网络设备硬件设计和处理方便,首部长度需要4字节的整数倍。
如果去掉UDP包长度字段,那UDP首部长度就不是4字节的整数倍了
10为什么是三次握手?不是两次,四次?
TCP连接是用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket,序列号和窗口大小称为连接。所以,重要的是为什么三次握手才可以初始化Socket,序列号和窗口大小并建立TCP连接。
为什么是三次握手的原因:
三次握手才可以阻止历史重复连接的初始化(主要原因)
三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。网络环境错综复杂,往往并不是如我们期望的一样,先发送数据包,就先到达目标主机,反而它很骚,可能会由于网络拥堵等原因,使得旧的数据包,先到达目标主机。
客户端连续发送多次SYN建立连接的报文,在网络拥堵等情况下:
一个旧的SYN报文比最新的SYN报文早到达了服务端;
那么此时服务端就会回一个SYN+ACK报文给客户端;
客户端收到后可以根据自身的上下文,判断这是一个历史连接(序列号过期或超时),那么客户端就会发送RST报文给客户端,表示中止这一次连接。
如果是两次握手连接,就不能判断当前连接是否是历史连接,三次握手则可以再客户端(发送方)准备发送第三次报文时,客户端因有足够的上下文来判断当前是否是历史连接:
如果是历史连接(序列号过期或超时),则第三次握手发送的报文是RST报文,以此中止历史连接;
如果不是历史连接,则第三次发送的报文是ACK报文,通信双方就会成功建立连接;
所以,TCP使用三次握手建立连接的最主要原因是防止历史连接初始化了连接。
三次握手才可以同步双方的初始序列号
TCP协议的通信双方,都必须维护一个序列号,序列号是可靠传输的一个关键因素,作用:
接收方可以去除重复的数据;
接收方可以根据数据包的序列号按序接收;
可以标识发送出去的数据包中,那些是已经被对方接收到的;
可见,序列号在TCP连接中的占据着非常重要的作用,所以客户端发送携带初始化序列号的SYN报文的时候,需要服务端回一个ACK应答报文,表示客户端的SYN报文已经被服务端成功接收,那当服务端发送初始序列号给客户端的时候,依然也要得到客户端的应答回应,这样一来一回,才能确保双方的初始化序列号能被可靠的同步。四次握手其实也能够可靠的同步双方的初始化序号,但由于第二步和第三步可以优化成一步,所以就成了三次握手。而两次握手只保证了一方的初始序列号能够被对方成功接收,没办法保证双方的初始序列号都能被确认接收。
三次握手才可以避免资源浪费
如果只有两次握手,当客户端的SYN请求连接在网络中堵塞,客户端没有接收到ACK报文,就会重新发送SYN,由于没有第三次握手,服务器不清楚客户端是否收到了自己发送的建立连接的ACK确认信号,所以每收到一个SYN就只能先主动建立一个连接。如果客户端的SYN堵塞了,重复发送多次SYN报文,那么服务器在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费
。即两次握手会造成消息滞留情况下,服务器重复接受无用的连接请求SYN报文,而造成重复分配资源。
总结:TCP建立连接时,通过三次握手可以防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复,不丢弃和按序传输
不使用两次握手和四次握手的原因:
两次握手:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
四次握手:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。
11.为什么客户端和服务端的初始序列号ISN是不相同的?
因为网络中的报文会延迟,会复制重发,也可能丢失,这样会造成的不同连接之间产生相互影响,所以为了避免相互影响,客户端和服务端的初始化序列号是随机且不同的。
12.初始序列号是如何随机产生的?
起始ISN是基于时钟的,每4毫秒+1,转一圈要4.55个小时。RFC1948中提出了一个较好的初始化序列号ISN随机生成算法。
ISN=M+F
M:是一个计时器,这个计时器每隔4毫秒加加1.
F:是一个Hash算法,根据源IP,目的IP,源端口,目的端口生成一个随机数值。要保证Hash算法不能轻易被外部推算出,用MD5算法是一个比较好的选择。
13.既然IP层会分片,为什么TCP层还需要MSS呢?
MTU:一个网络包的最大长度,以太网中一般为1500字节;
MSS:除去IP和TCP头部之后,一个网络包所能容纳的TCP数据的最大长度;
如果TCP的整个报文(头部+数据)交给IP层进行分片,会有什么异常?
当IP层有一个超过MTU大小的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值