TCP连接建立与断开
2016-04-02 10:22
393 查看
TCP-建立连接
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。1)是第二次握手,flags位上为12,二进制是0001 0010,即表示有syn和ack.
2)是第一次握手,flags位上为02,二进制是0000 0010,即表示有syn没有ack。
3)是第三次握手,flags位上为10,二进制是0001 0000,即表示有ack没有syn。
该连接访问的是80端口,是为HTTP(HyperText Transport Protocol,超文本传输协议)开放的,
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。
TCP-断开连接:
主要部分,四次握手:断开连接其实从我的角度看不区分客户端和服务器端,任何一方都可以调用close(or closesocket)之类
的函数开始主动终止一个连接。这里先暂时说正常情况。当调用close函数断开一个连接时,主动断开的
一方发送FIN(finish报文给对方。有了之前的经验,我想你应该明白我说的FIN报文时什么东西。也就是
一个设置了FIN标志位的报文段。FIN报文也可能附加用户数据,如果这一方还有数据要发送时,将数据附
加到这个FIN报文时完全正常的。之后你会看到,这种附加报文还会有很多,例如ACK报文。我们所要把握
的原则是,TCP肯定会力所能及地达到最大效率,所以你能够想到的优化方法,我想TCP都会想到。
当被动关闭的一方收到FIN报文时,它会发送ACK确认报文(对于ACK这个东西你应该很熟悉了)。这里有个
东西要注意,因为TCP是双工的,也就是说,你可以想象一对TCP连接上有两条数据通路。当发送FIN报文
时,意思是说,发送FIN的一端就不能发送数据,也就是关闭了其中一条数据通路。被动关闭的一端发送
了ACK后,应用层通常就会检测到这个连接即将断开,然后被动断开的应用层调用close关闭连接。
我可以告诉你,一旦当你调用close(or closesocket),这一端就会发送FIN报文。也就是说,现在被动
关闭的一端也发送FIN给主动关闭端。有时候,被动关闭端会将ACK和FIN两个报文合在一起发送。主动
关闭端收到FIN后也发送ACK,然后整个连接关闭(事实上还没完全关闭,只是关闭需要交换的报文发送
完毕),四次握手完成。如你所见,因为被动关闭端可能会将ACK和FIN合到一起发送,所以这也算不上
严格的四次握手—四个报文段。
相关文章推荐
- .NET软件工程师网络在线就业培训_周末上课,上海就业
- 网络工程师葵花宝典
- 两例网络超时的定位
- C++卷积神经网络实例:tiny_cnn代码详解(12)——从CNN中看多态性
- 路由技术之ip汇总方法(列表法)
- 扣丁学堂笔记第18天HttpURLConnection与HttpClient
- Bzoj:1324:Exca王者之剑:网络流,最小割
- Android开发之网络通讯详解
- go简易tcp socket客户端和服务器
- Genymotion添加模拟器时报“Unable to create virtual device,Server returned HTTP status code 0”
- centos 无线网络连接
- TCP的三次握手和四次挥手
- [javaEE] HTTP协议总结
- 1501 二叉树最大宽度和高度——http://codevs.cn/problem/1501/
- Jsoup无法获取document内容报告403错误(网络错误)
- HTTP响应头信息和请求头信息详解
- HTTP响应头和请求头信息对照表
- 重温 tcp/ip
- http libevent的使用
- Https加密及攻防