UNP——第二章,TCP握手与挥手分析
1.握手
说明:
下面涉及 FIN,SYN,ACK之类数据时,都是由TCP服务收发,
涉及 accept, listen 之类api,都是 应用进程 完成。
都统一使用 客户端,服务端描述,请自行分辨。
(1)首先描述下3次握手,TCP协议做了什么。
客户端,主动打开,发送自己的序列号SYNj,并期待对方回复ACKj+1
服务端,被动打开,接送自己的序列号SYNk和ACKj+1,并期待对方回复ACKk+1
客户端,接收对方ACK,己方打开完成,接收对方SYN,发送ACKk+1
服务端,接收对方ACK,己方打开完成。
分析下:
首先打开分为,被动打开和主动打开。
当接收到对方的ACK,则己方打开完成,则可以使用socket进行读写操作,但并不保证正常。
(2)结合 系统调用分析三次握手
客户端,listen,进行被动打开
服务端,connect ,进行主动打开,发送SYNj(如果乙方此时没有listen 完成,则connect 失败)
客户端,回复SYNk + ACKj+1, 应用层无任何变化。
服务端,收到 ACKj+1 + SYNk,并回复 ACKk+1, 甲方打开完成,connect 返回。
客户端,收到ACKj+1,可以进行 read,write。
服务端,accept,如果乙方没有收到 SYNj 则会阻塞,否则返回
服务端,收到ACKk+1,可以进行 read, write
总结下:
从应用层角度,三次握手的开始,
主动方,始于 connect,结束于 connect
被动方,始于 listen ,结束于 listen
accept 是被动方处理已经完成握手的主动方。
(3)实验
client
- if (0 > (connect(fd, (struct sockaddr *)&addr, sizeof(addr)))) {
- perror("connect");
- exit(-1);
- }
- printf("success to connect\n");
- write(fd, "hello world", strlen("hello world"));
- printf("write over\n");
- close(fd);
server
- if (0 > listen(fd, 10)) {
- perror("listen");
- exit(-1);
- }
- #if 1
- printf("sleep for delay accept...\n");
- sleep(5);
- printf("sleep over\n");
- #endif
- if (0 > (c_fd = accept(fd, (struct sockaddr *)&c_addr, &len))) {
- perror("accept");
- exit(-1);
- }
- printf("success to accept\n");
- while ((nbytes = read(c_fd, msg, MAX_READ))) {
- msg[nbytes] = 0;
- printf("%s", msg);
- }
- printf("\n");
- if (0 > (nbytes = write(c_fd, "bye", 3))) {
- perror("write");
- exit(-1);
- }
- printf("i have see bye\n");
- close(fd);
- close(c_fd);
实验结果
- sleep for delay accept...
- sleep over // 这里客户端已经通信结束,程序退出
- success to accept
- hello world
- i have see bye
可以发现,客户端虽然已经挥手,但是服务端仍然视为握手完成,并正常的进行通信。
用netstat查看
可以发现,客户端进程虽然死掉,但打开的TCP服务并没有关闭,他在等待四次挥手完成。
因此服务端,虽然延迟处理,却依旧能正常处理通信。、
2.四次挥手
客户端,主动关闭,close,发送 FINm
服务端,被动关闭,接收FINm,发送ACKm+1
一段时间后,服务端,调用close,发送FINn
客户端,接收FINn,发送ACKn+1
总结下:
当服务端接收到FIN时,注意,所有的TCP数据都由TCP服务处理,服务端的TCP收到FIN,并向服务端进程发送文件结束符EOF。
EOF按照顺序在通信数据后面。
当服务端进程read获得EOF,适时主动调用close,以发送 FINn。
在客户端close,服务端没有close的阶段,称为 半关闭。
这时,服务端进程可以发送数据,数据会交给客户端TCP服务,但不会上交给应用层。所以客户端进程是否存在,没关系。
UNP——第二章,TCP握手与挥手分析的更多相关文章
- TCP 握手和挥手图解(有限状态机)
1.引言 TCP 这段看过好几遍,老是记不住,没办法找工作涉及到网络编程这块,各种问 TCP .今天好好整理一下握手和挥手过程.献给跟我一样忙碌,找工作的童鞋,欢迎大神批评指正. 2.TCP 的连接建 ...
- 第二章 TCP/IP 基础知识
第二章 TCP/IP 基础知识 TCP/IP transmission control protocol and ip internet protocol 是互联网众多通信协议中最为著名的. ...
- 抓包分析 TCP 握手和挥手
前言 首先需要明确的是 TCP 是一个可靠传输协议,它的所有特点最终都是为了这个可靠传输服务.在网上看到过很多文章讲 TCP 连接的三次握手和断开连接的四次挥手,但是都太过于理论,看完感觉总是似懂非懂 ...
- UNP——第二章,端口号,套接字对,TCP,UDP输出
1.端口号 端口号用于区分使用相同协议的进程. TCP69 与 UDP69 是不同的. 端口号范围 0 - 65535, 其中 0- 1023 是保留端口. 2.套接字对 TCP服务通过套接字对,唯一 ...
- UNP——第二章,TCP状态,TIME_WAIT
状态可以用 netstat 验证 加粗线为 数据交换. 可以看出,TCP在 建立连接和 关闭连接,耗费资源, 因为UDP只需要两次数据通信即可. 但UDP没有可靠传输,和流量控制. 上面协商的MSS为 ...
- CCNA第二章TCP/IP简介考试要点学习笔记
1.描述网络是如何工作的 DoD过程/应用层 -- OSI应用.表示和会话层(定义了结点到结点的应用通信协议以及对用户界面规范的控制): DoD主机到主机层 -- OSI传输层(保证了数据包的 ...
- UNP——第二章,常见协议概述
1.为什么要了解协议 程序员与协议合作,完成应用. 了解协议是为了了解协议完成了什么,提供了什么服务,自己还应该做什么. 2.从协议的角度,套接字是什么 套接字是协议的接口, IP套接字,代表可使用I ...
- [Maven实战-许晓斌]-[第二章]-2.3安装目录分析
bin boot conf settings.xml非常重要 这个是maven安装包自带的settings.xml 通常我们会放在习惯路径,C:\Users\admin\.m2\下面 即 用户路径\ ...
- TCP/IP三次握手四次挥手分析
流程图 全部11种状态 客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 服务器独有的:(1)LISTEN (2 ...
随机推荐
- Java 集合看这一篇就够了
大家好,这里是<齐姐聊数据结构>系列之大集合. 话不多说,直接上图: Java 集合,也称作容器,主要是由两大接口 (Interface) 派生出来的: Collection 和 Map ...
- MySQL【灵魂拷问】
MySQL 一直是本人薄弱的部分,后面会多总结 MySQL 的文章,毕竟 MySQL 涉及到数据存储.锁.磁盘寻道.分页等操作系统概念,而且互联网对 MySQL 的注重程度是不言而喻的,后面要加紧对 ...
- MeteoInfoLab脚本示例:计算不同区域平均值
这里用美国做例子,有一个美国区域的格点温度场数据(usgrid.data),需要计算出每个州(state)的平均温度.当然需要有一个包含各州行政区域的shape文件了(相关文件可以在此帖中下载:htt ...
- 【暑假集训】HZOI2019 水站 多种解法
题目内容 已知有一个\(n\)层的水站: \(W_i\)表示未操作之前第\(i\)层的已有水量: \(L_i\)表示第\(i\)个水站能够维持或者储存的水的重量: 表示在第\(P_i\)层进行减压放水 ...
- 可变数据类型不能作为python函数的参数
可变数据类型:列表.字典 不可变数据类型:整型.浮点型.字符串.元组 为什么可变数据类型不能作为python函数的参数?请看以下例子: def foo(a=[]): a.append(1) retur ...
- SpringMVC异常的处理机制
SpringMVC异常的处理机制 处理流程图 其本质还是把异常交给SpringMVC框架来处理 系统的dao.service.controller出现异常都通过throws Exception向上抛出 ...
- 在学习python的过程中,遇到的最大的困难是什么?
本人文科生,回顾自己近 2 年的Python 自学经历,有一些学习心得和避坑经验分享给大家,让大家在学习 Python 的过程中少走一些弯路!减少遇到不必要的学习困难! 首先,最开始最大的困难应该就是 ...
- Spring Boot打包部署
date: 2018-11-19 15:30:11 updated: 2018-11-21 08:28:37 Spring Boot打包部署 第一种方式 打包成jar包部署在服务器上 1.1 添加插件 ...
- Python作业1
name = " aleX" # 1 移除 name 变量对应的值两边的空格,并输出处理结果 print(name.strip()) # 2 判断 name 变量对应的值是否以 & ...
- 打爆你的 CPU
打爆你的 CPU Intro 今天来尝试写一段代码,把 CPU 打满,让所有处理器的 CPU 使用率达到 100% 如何提高 CPU 使用率 想要提高 CPU 的使用率就是要让 CPU 一直在工作,单 ...