[关闭]
@lzb1096101803 2016-03-04T23:50:38.000000Z 字数 2184 阅读 398

TCP报文 三次握手和四次挥手

面试 计算机网络


http://blog.csdn.net/renzhenhuai/article/details/12105457

http://www.cnblogs.com/BlueTzar/articles/811160.html

TCP为什么需要3次握手与4次挥手

http://blog.csdn.net/xifeijian/article/details/12777187
“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。主要目的防止server端一直等待,浪费资源。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。

接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。

三次握手和四次挥手

所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:

TCP三次握手
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN**一般**都会分开发送。

TCP 拥塞控制。

TCP数据传输策略
包括可靠传输和流量控制
如何实现流量控制:使用接收窗口的方式,会为对方建立一定大小的缓冲区
应答时就会把大小告诉对方,就是TCP段头中的窗口大小字段,对方就知道我可以发送多少数据,称为窗口公告

数据丢失的两种情况:接收缓冲区小,网络带宽小
为什么数据链路层不考虑????
物理网络有的带宽高,有的带宽低,8车道突然经过2车道肯定要堵塞,扔掉了
要考虑中间的网络有多少能力转发,发送方怎么知道要经过那几个网络呢?
网络带宽是多少呢?也不知道。有可能本来就很小却还要为别人服务?也不知道
用拥塞窗口衡量
主机如何知道拥塞了:收到ICMP(网络层的)的源抑制报文:因报文丢失引起的超时
拥塞窗口大小随着时间变化,减少数据丢失的可能性,实现知道网络能够传递多少数据。
有了接收窗口和拥塞窗口,不能超过着两个窗口
取两个窗口之中的最小值,保证数据能够到达接收方
如何知道拥塞窗口多大,如何知道网络能够帮我传递多少 数据
不知道繁忙不繁忙,可能一时空闲一时繁忙,所以拥塞窗口是动态变化 的
所以有了初始化和修正过程

拥塞窗口的初始化
先测量网络能够给我提供多少带宽:
拥塞窗口初始化大小而我最大数据包长度,发一个最大长度的数据包,在定时器 超时前得到确认,窗口大小*2,不断*2长度,直到传输超时或达到接收方接收窗口大小为止

如果拥有的带宽 变小,如何调整?什么时候调整
当网络变糟的时候修正
TCP保证可靠性,丢失就要重复,丢失越多,重发的量越大,所以拥塞窗口的修正应该尽快缓解拥塞,即发送数据量量迅速减少,直接把拥塞窗口设置为最小:一个数据包大小。
还有一个临界值:敏感值,超过这个值随时有可能发送拥塞,数据包丢失了,认为发送了拥塞,如何解除,先恢复到最小,临界值设为当前拥塞窗口的一半,然后又进行拥塞窗口探测过程,*2过程,知道临界值,如到临界值还能通过,不再成倍增长,进行线性增加,一个一个数据包长度增加

http://www.cnblogs.com/newwy/p/3254029.html
http://blog.sina.com.cn/s/blog_6988593e01015wu0.html

TCP 滑动窗口与回退 N 针协议。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注