网络编程socket 之TCP三路握手和四路握手
来源:互联网 发布:绝对萌域淘宝店名 编辑:程序博客网 时间:2024/05/19 03:42
学习主要内容:
1.TCP三路握手和四路握手
2.TCP的常见标识以及监听端口的状态
先模拟一个场景,“向东A"有一亲密基友“攀攀B”,一天A晚上想约B 出去溜冰,由于地理原因,就选择打电话通知
......两人经过各自身份确认后才会进行下面的秘密交谈. TCP 的三路握手连接也是这样的....
三路握手
以下为三路握手的整个过程:
1.服务器必须准备好接受外来连接。通常调用的是socket,bind和listen这三个函数来完成。我们称之为被动打开(passive open).完成服务器将监听端口状态为:listen
2.客户端通过connect 发起主动打开(active open)向指定地址服务端发送一个 SYN分节,和初始化序列号
3.服务器必须确认(ACK)客户端的SYN,同时自己也要发送一个SYN分节。
4.客户端必须确认服务器的SYN
这样交换至少三个分组,因此称之为TCP三路握手
在此过程中,客户端和服务端都会开启一个端口进行消息传送,同时它们的端口状态也在放生不同状态转换
客户端口转换过程
客户端: closed-----发送SYN---->SYN_SENT----接受到SYN ACK-->ESTABLISHED----发送ACK--->
服务端口转换过程
服务端: listen -----接收到SYN---->SYN_RCVD---发送SYN ACK--->SYN_RCVD----------接受ACK---->ESTABLISHED
有开始就有结束,既然有了连接就一定有关闭连接。TCP 连接的终结者---四路握手
四路握手
TCP 建立连接需要3个分节,终止一个连接则需要4个分节
以下为四路握手的整个过程:
1.应用进程调用了close函数.我们称该端执行了“主动关闭”(无论客户端和服务端,调用close函数就是主动关闭,提出主动关闭的一端是需要付出代价的,等待2个MSL时间).该端发送一个FIN分节表示数据发送完毕.
2.接受到FIN的对端执行“被动关闭”,这个FIN是由TCP确认,FIN的接受也作为一个文件接受符传递给接受端应用进程,意味着接受端应用进程在相应连接上再无数据可接受
3.一段时间后,接受到这个文件结束符的应用进行将调用close关闭它的套接字,这导致它的TCP也发送一个FIN
4.最后接受这个最终FIN的原发送端TCP(执行主动关闭那一端)确认这个FIN。
引自Unix网络编程图片如下:
.....................理想很丰满,但现实很骨感.....................
我用wireshark 进行了多次测试........显示内容大概如下:
简单分析下: 9339端口向 61544发送 FIN ACK 序列号 73
61544 端口 响应 9339端口 ACK (为什么这么确定? ACK:74= Seq:73 +1)
61544 端口 同样向9339端口 发送 FIN ACK
最后 9339端口 响应 ACK 給61544
怎么会是这样子的?我不敢说出“Unix网络编程”的作者写错了,我也在质疑是否平台环境造成的这种现象,这也是我的疑问,求高手解答
我测试的环境是window 和Linux ................................
其实网上通过wireshark抓包 都是这个样子,但没有找到确切解释(不管怎么说原理是一样的)
将上图简单调整下------window,Linux下的四路握手状态图:
到此结束TCP的三路,四路握手就是这些,下面对上述内容作一简单总结
总结一:TCP层标识
TCP有个FLAGS字段,这个字段有以下几个常用标识:
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
ACK (Acknowledge number 确认号码)
(但远非这几个,其他的不常用)
总结二:端口状态
TCP 的端口连接状态
1.LISTENING状态 :服务端口启动后处于的状态
2.ESTABLISHED状态:服务端与客户端建立连接成功的状态.表示两台机器可以通信
3.CLOSE_WAIT:对方主动关闭连接或者网络异常导致连接中断,此时我方要调用close来使连接正确关闭
4.TIME_WAIT:调用close方法,并成功收到对方确认后变为TIME_WAIT,测试端口资源不会立即释放
5.SYN_SENT:请求连接时客户端首先要发送同步信号给要访问的机器,此时状态为SYN_SENT,如果连接成功了就变为ESTABLISHED,正常情况下SYN_SENT状态非常短暂
6.SYN_RCVD:当服务器收到客户端发送的同步信号时,将标志位ACK和SYN置1发送给客户端,此时服务器端处于SYN_RCVD状态,如果连接成功了就变为ESTABLISHED,正常情况下SYN_RCVD状态非常短暂
0 0
- 网络编程socket 之TCP三路握手和四路握手
- TCP的三路握手和四路挥手
- TCP的三路握手和四路挥手及其临界条件(结合系统调用)
- Socket编程-TCP三次握手
- tcp三次握手、socket编程
- 网络基础三之TCP三次握手四次分手
- TCP的三次握手和四次握手是在socket编程的什么阶段发生的
- 网络 TCP/IP SOCKET 三次握手
- 【Linux网络编程】浅谈 TCP 三次握手和四次挥手
- tcp 三路握手过程
- TCP三路握手的状态转移和socket函数调用关系时序图
- 网络编程之TCP协议为啥是三次握手和四次挥手?
- linux网络编程之tcp的三次握手和四次挥手
- 网络编程之TCP协议为啥是三次握手和四次挥手?
- 【网络基础】TCP协议之三次握手和四次挥手
- socket 编程入门教程(三)TCP原理:5、TCP的三次握手(three-way handshake)
- 网络(一) 之 TCP三次握手
- tcp 三握手和四挥手理解
- post===non posted transaction事务类型学习--PCIE学习笔记
- 多播的实现和需要注意的问题
- CentOS下Nexus安装
- Logistic and Softmax Regression (逻辑回归和Softmax回归)
- 【Spark亚太研究院系列丛书】Spark实战高手之路-第3章Spark架构设计与编程模型第1节:为什么Spark是大数据必然的现在和未来?(1)
- 网络编程socket 之TCP三路握手和四路握手
- Zookeeper的安装和配置
- struts zip打包多个文件并下载
- HDOJ Big Number 1018
- sgu121
- 研吧电源技术之新形势下电源的发展方向(1)
- start service失败的问题解决
- UVa 12504 - Updating a Dictionary
- 计蒜客 元素移除