TCP 基本概念
Posted ts65214
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP 基本概念相关的知识,希望对你有一定的参考价值。
ip协议不可靠,会丢失、出错、乱序 延迟、重复
tcp可靠性是指数据的可靠传递,或故障的可靠通知
tcp为保证可靠性,使用了“带重传的正面确认”技术
1.发送端需要知道接收端有没有收到段,接收端需要返回ack。
2.超时未收到ack就重传,重传会导致段重复,序号可以识别重复的段
3.停等式发一个确认一个太慢,使用滑动窗口可以批量发送批量接收,
此时需要知道ack确认的是哪个段,通过序号可以指明ack所确认的段。
4.报文如果能在网络中永久存在,发送端需要永久维护所有连接所使用过的所有序号,
难以实现。
5.所以对报文添加跳数限制(最大255),
并认为经过最大报文生存时间(MSL,maximum segment lifetime)后,
某个段和它的ack已经不存在了。
发送端需要保证序号在MSL秒内不会重复。Internet中MSL是120秒或30秒
解决丢失:确认超时后重传,即自动重复请求(ARQ,Automatic Repeat reQuest)
解决重复:序号
解决乱序:序号
差错控制:校验码
多路复用:发送端的传输层从不同套接字中收集数据块,添加首部生成报文段,传给网络层
多路分解:接收端的传输层根据报文段中的首部,将数据交付给正确的套接字
流量控制: 应用程序从接收缓存里读取数据比发送端发送数据慢,接收缓存就可能溢出。
接收方返回愿意接收的字节数量(称为通告窗口),发送方改变滑动窗口大小
当接收方返回愿意接收的字节数量为0时:
接收方有缓存空间时向发送方发送新的窗口大小,窗口通告可能会丢失造成死锁
发送方可以发送1字节的报文段,强制接收方宣告窗口大小,这被称为窗口探测
发送端不一定要立即发送应用程序发来的数据,而是可以将数据缓冲起来
接收方也不一定要尽可能快的发送确认段
使用ssh时,每发送一个字节、确认字节、窗口更新、字符回显,都需要大量额外的报文首部,
许多tcp实现采用了延迟确认方法,将确认和窗口更新延迟50毫秒,希望能搭载更多的数据
Nagle方法:在下一个确认到来前,将要发送的数据缓存起来,确认到达后再发送数据
Nagle有时会造成短暂的死锁,即发送方等待确认以便发送更多的数据,
而接收方等待上层数据到来以便捎带确认
有些时候(例如游戏)可以用TCP_NODELAY选项禁用Nagle
低能窗口综合症:接收端缓冲区满,应用程序每次从缓冲区取走一个字节,
接收端向发送端宣告一字节的可用窗口,发送端发送一字节,
接收端缓冲区又满了,不停的重复这种情况
Clark方法:接收端缓冲区的一半为空,或者能装下一个最大数据段时,
接收端才发送窗口更新段,
发送端的段超过接收端缓冲区的一半,或者超过最大数据段时,
发送端才发送数据
持续计时器:接收端窗口由0变为100,接收端更新窗口,但该报文段丢失了,
然后发送端和接收端都在等待对方的动作。当持续计时器超时后,
发送端发送一个探询消息,接收端告知窗口大小
保活计时器:有些tcp实现了保活计时器,连接空闲一段时间后,查看对方是否还在,不在就断开连接
序号:随机的 __u32 型整数,不会被攻击者猜到。
序号s2=s1+k溢出后,内核判断s1<s2:return (__s32)(s1-s2) < 0;
__s32是有符号整型,这里假设增量k<2^(n-1)-1
捎带:把对流的控制信息放到传送数据的数据报中。
端点(endpoint):(host, port),例如(192.168.250.250,8080)。
TCP连接由一对端点来标志
TCP是全双工的,两端都有自己的发送窗口和接收窗口,一个连接有4个窗口
最大传输单元(Maximum Transmission Unit,MTU),链路层帧的最大长度,通常为1500字节,
有多种发现路径MTU并以此设置MSS的方法。
最大报文段长度(Maximum Segment Size,MSS),MTU减去TCP和IP首部(通常40字节),
通常为1460字节
以上是关于TCP 基本概念的主要内容,如果未能解决你的问题,请参考以下文章