【痛定思痛】TCP 三次握手学习

前言:今天滴滴面试失败,痛定思痛,好好复习面试中最惨淡的计算机网络部分

面试中,面试官问我TCP与UDP最大的区别是什么,答:TCP可靠,UDP不可靠,一个面向有连接,一个面向无连接,一个快一个慢;追问tcp,答:tcp建立了连接,所以丢包或者不完整会重传;问:只有这些吗? 答:卡壳 ;问:其实还有顺序传输。问:知道TIME WAIT吗? 答:不知道

TCP特点:TCP和UDP差别相当大,TCP充分实现了数据传输中的各种控制功能,可以进行丢包时的充发控制,可以对次序乱掉的分包进行顺序控制。而且TCP作为面向有连接的协议,只有确认通信端存在时,才会发送数据,从而可以控制通信流量的浪费。

一.TCP服务模型

TCP服务由发送端和接收端创建一种套接字(socket)的端点来获得,每个套接字有一个套接字编号(地址),该编号由主机的IP地址以及一个本地主机的16位数值组成。这个16位数值称为端口(port)。为了获取TCP服务,必须显式地在一台机器和另一台机器的套接字之间建立一个连接。

所有TCP连接都是全双工的,并且是点到点的。所谓全双工,意味着同时可以在两个方向上传输数据,点到点则意味着每个连接恰好有两个端点。TCP不支持组播或者广播的方式。一个TCP连接就是一个字节流,而不是消息流。端到端之间不保留消息的边界。接收端不知道数据被写成字节流时切分成多大,只知道最终接收到了多大的数据。

当一个应用将数据传递给TCP时,TCP可以立即发出消息,也可以缓存到更多数据后一起发出去。因此TCP有一个PUSH标志位,告诉TCP不要延时传输。

二.TCP协议

每个网络都有一个最大传输单元MTU,发送端和接收端的每个段都必须适合MTU,才能单个不分段的传输数据,MTU通常是1500字节。

ACK被设置为1表示确认号字段是有效的。如果ACK为0,则该段不包含确认信息。

RST被用于突然重置一个以及变得混乱的连接,混乱有可能是由于主机崩溃,或者其他的原因。该标志位可以用来拒收一个无效的字段,或者拒绝一个连接请求。

SYN被用于建立连接的过程。在连接请求中,SYN=1 和 ACK = 0,表示该字段没有使用稍待的确认字段,但是,连接应答稍待的一个确认,因此SYN=1和ACK=1。本质上SYN位被用来同时表示CONNECTION REQUEST 和 CONNECTION ACCEPTED,然后进一步用ACK位来区分这两种可能。

FIN被用来释放一个连接。然而,在关闭一个连接之后,关闭进程可能会在一段不确定的时间内继续接受数据,SYN和FIN段都有序号,从而保证了这种段以正确的方式被处理。

TCP中的流量控制是通过一个可变大小的滑动窗口来控制的。窗口大小字段制定了从被确认字节算起可以发送多少个字节。窗口大小字段可以为0,说明到现在为之已经接收了多个确认号为-1的字节,但是接收端没有更多的机会来消耗数据,希望别再发数据,以后接收端可以通过发送一个具有同样确认号但是非零的窗口大小字段来通知重新发段。

   需要注意的是:
                (A)不要将确认序号Ack与标志位中的ACK搞混了。
                (B)确认方Ack=发起方Req+1,两端配对。

三.TCP连接建立

TCP使用三次握手来建立连接。它要求一方检查连接请求是否是确实是当前的。主机一选择一个序号x,并且发送一个包含x的CONNECTION REQUEST段给主机二。主机二回复一个ACK段作为对x的确认,并且宣告他自己的初始序号为y。最后主机一在他发送的第一个字段的数据中,对主机二的初始序号进行确认。

正常情况下应该是:

 

猜你喜欢

转载自www.cnblogs.com/samanian/p/11740641.html