【网络编程】TCP原理

TCP套接字中的I/O缓冲

write函数调用后并非立即传输数据,read函数调用后也非马上接收数据。write函数调用瞬间,数据将移至输出缓冲;read函数调用瞬间,从缓冲读取数据。

这些IO缓冲特性可整理如下。

  • 口IO缓冲在每个TCP套接字中单独存在。
  • 口I/O缓冲在创建套接字时自动生成。
  • 口即使关闭套接字也会继续传递输出缓冲中遗留的数据。
  • 口关闭套接字将丢失输人缓冲中的数据。

TCP会控制数据流,不会因为缓冲溢出而丢失数据。

TCP 内部工作原理1:与对方套接字的连接

  1. 与对方套接字建立连接。
  2. 与对方套接字进行数据交换。
  3. 断开与对方套接字的连接。

对方套接字建立连接的过程。连接过程中套接字之间的对话如下

  1. Shake 1\]套接字A:"你好,套接字B。我这儿有数据要传给你,建立连接吧。

  2. Shake 3\]套接字A:"谢谢你受理我的请求。"

套接字是全双工方式工作的,可以双向传递数据。

SEQ:1000,ACK为空意思是现传递的数据包序号为1000,若无误通知我传输1001数据包。

SYN是Synchronization简写,表示收发数据前传输的同步信息。

SYN+ACK\]SEQ:2000,ACK:1001,此时SEQ为2000,ACK为1001 "现传递的数据包序号为2000,如果接收无误,请通知我向您传递2001号数据包。"而ACK 1001的含义如下:"刚才传输的SEQ为1000的数据包接收无误,现在请传递SEQ为1001的数据包。" ### **TCP 内部工作原理2:与对方主机的数据交换** 通过第一步三次握手过程就完成了数据交换准备,开始收发数据。 ![](https://img-blog.csdnimg.cn/direct/d7e4b90997a54b10861056c73cfa3cc5.png) 主机A分两次向主机B传递200字节。首先,主机A通过1个数据包发送100个字节数据,SEQ为1200。B向A发送ACK1301确认。ACK不为1201是因为ACK号的增量为传输的数据字节数。+1是为了告知对方下次要传递的SEQ号。 ### **TCP 内部工作原理3:断开与套接字的连接** 1. 套接字A:"我希望断开连接。 2. 套接字B:"哦,是吗?请稍候。" 3. 套接字B:"我也准备就绪,可以断开连接。 4. 套接字A:"好的,谢谢合作。" ![](https://img-blog.csdnimg.cn/direct/f4f5d22a33e8427c8cef2039799adb39.png) 双方各发送1次FIN消息后断开连接。此过程经历4个阶段,因此又称四次握手(Four-way handshaking)。

相关推荐
IT 乔峰9 分钟前
linux部署DHCP服务端
linux·运维·网络
Wokoo712 分钟前
HTTP不同版本核心对比
网络·网络协议·tcp/ip·http·udp·ssl
IDC02_FEIYA36 分钟前
服务器带宽怎么计算最大并发?服务器带宽计算公式
运维·服务器
lifejump43 分钟前
NAT应用实验
运维·服务器
Hy行者勇哥1 小时前
Linux 系统搭建桌面级云端办公 APP(从快捷方式到自定义应用)
linux·运维·服务器
在路上看风景1 小时前
7.4 KDC和CA
网络
python百炼成钢1 小时前
52.Linux PWM子系统
linux·运维·服务器·驱动开发
新诺韦尔API1 小时前
手机空号检测接口对接全流程指南
大数据·网络·智能手机·api
乾元2 小时前
AI + Jinja2/Ansible:从自然语义到可执行 Playbook 的完整流水线(工程级深度)
运维·网络·人工智能·网络协议·华为·自动化·ansible
ZhengEnCi2 小时前
一次多线程同步问题的排查:从 thread_count 到 thread.join() 的踩坑之旅
python·网络协议·tcp/ip