转:摘自《图解TCP/IP》P204

三次握手与四次挥手的状态转移图如下:

如图,由于第二次握手接收端发送SYN+ACK信号所以握手只用了三次,挥手由于接收端ACK和FIN分两次发的,所以挥手需要四次

最后接收端需要一个TIME_WAIT状态,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

整个Client(发送端)状态图如下:

整个Server(接收端)状态图如下:

处在SYNC_RECV的TCP连接称为半连接,并存储在内核的半连接队列中,在内核收到对端发送的ack包时会查找半连接队列,并将符合的requst_sock信息存储到完成三次握手的连接的队列中,然后删除此半连接。

关于 seq ack 

建立连接阶段:

序号    方向     seq         ack
1   A->B   10000   0
2   B->A   20000   10000+1=10001
3   A->B   10001   20000+1=20001
解释:
1:A向B发起连接请求,以一个随机数初始化A的seq,这里假设为10000,此时ACK=0

2:B收到A的连接请求后,也以一个随机数初始化B的seq,这里假设为20000,意思是:你的请求我已收到,我这方的数据流就从这个数开始。B的ACK是A的seq加1,即10000+1=10001

3:A收到B的回复后,它的seq是它的上个请求的seq加1,即10000+1=10001,意思也是:你的回复我收到了,我这方的数据流就从这个数开始。A此时的ACK是B的seq加1,即20000+1=20001

数据传输阶段:

序号    方向      seq     ack                size
23     A->B       40000     70000               1514
24     B->A       70000     40000+1514-54=41460       54
25     A->B       41460     70000+54-54=70000       1514
26     B->A       70000     41460+1514-54=42920       54
解释:
23:B接收到A发来的seq=40000,ack=70000,size=1514的数据包
24:于是B向A也发一个数据包,告诉B,你的上个包我收到了。B的seq就以它收到的数据包的ACK填充,ACK是它收到的数据包的SEQ加上数据包的大小(不包括以太网协议头,IP头,TCP头),以证实B发过来的数据全收到了。
25:A在收到B发过来的ack为41460的数据包时,一看到41460,正好是它的上个数据包的seq加上包的大小,就明白,上次发送的数据包已安全到达。于是它再发一个数据包给B。这个正在发送的数据包的seq也以它收到的数据包的ACK填充,ACK就以它收到的数据包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是头长,没数据项)。

其实在握手和结束时确认号应该是对方序列号加1,传输数据时则是对方序列号加上对方携带应用层数据的长度.如果从以太网包返回来计算所加的长度,就嫌走弯路了.
另外,如果对方没有数据过来,则自己的确认号不变,序列号为上次的序列号加上本次应用层数据发送长度.

最新文章

  1. D3.js学习(六)
  2. 原生JavaScript事件详解
  3. 【HTML5】Application Cache应用程序缓存
  4. eclipse 提交作业到JobTracker Hadoop的数据类型要求必须实现Writable接口
  5. inno setup详细使用教程
  6. SQL Server 数据类型简介
  7. MATLAB将批量的图片保存为mat文件
  8. 双程动态规划 nyoj61
  9. 【转载】深入浅出http请求
  10. WebApi异常
  11. C# 枚举常用工具方法
  12. Python 根据地址获取经纬度
  13. Linux 终端访问 FTP 及 上传下载 文件[转]
  14. Machine Learning - week 4 - Non-linear Hypotheses
  15. Linux开发-makefile
  16. myeclipse 的Customize Perspective 没有反应
  17. BZOJ_3879_SvT_后缀数组+单调栈
  18. Laravel5中通过SimpleQrCode扩展包生成二维码实例
  19. Android网络图片转换成bitmap保存到本地指定文件夹
  20. Python从菜鸟到高手(7):字符串

热门文章

  1. UVA 140_Bandwidth
  2. SecurityContextHolder.getContext().getAuthentication()为null的情况
  3. Servlet的服务端响应
  4. IOS开发之简单计算器
  5. [VueJS + Typescript] Decouple Dependencies Using IoC Containers in Vue with TypeScript and InversifyJS
  6. has实现 更新视图但不重新加载页面原理
  7. UVa10048_Audiophobia(最短路/floyd)(小白书图论专题)
  8. 软考之J2SE
  9. iOS学习笔记(4) — UITableView的 重用机制
  10. JSP学习笔记七之Cookie