服务器
|
|
客户端
|
Socket()
|
|
socket()
|
Bind()
|
|
↓
|
Listen()
|
|
↓
|
等待连接请求
|
←————请示连接 ————
|
connet()
|
accept()
|
|
↓
|
Recv()&Senc()
|
←————数据交互———→
|
Recv()&Send()
|
closesocket()
|
|
Closesocket()
|
|
应用层
|
传输层
|
←―(UDP 、TCP)
|
|
IP
|
|
与各种网络接口
|
应用进程 ←—→
主机 ←————→因特网←——————→
主机 ←—→ 应用进程
|
IP 协议的作用范围
↑————(提供主机之间的逻辑通信)———↑
|
TCP 和UDP 协议的作用范围
↑————————————(提供进程之间的逻辑通信)———————————↑
|
TCP 报文段 =
|
TCP 首部
↓
|
+
|
TCP 数据部分
↓
|
IP 首部
|
IP 数据部分
|
TCP首部
|
|||||||||
源端口
|
目的端口
|
||||||||
序号
|
|||||||||
确认号
|
|||||||||
数据
偏移
|
保留
|
URG
|
ACK
|
PSH
|
RST
|
SYN
|
FIN
|
窗口
|
|
检验和
|
紧急指针
|
||||||||
选项(长度可变)
|
填充
|
主机A
|
|
主机B
|
[主动打开]
|
|
[被动打开]
|
连接请求
|
———————SYN, SEQ = x—————→
|
|
|
←——SYN, ACK, SEQ = y, ACK= x + 1——
|
确认
|
确认
|
———ACK, SEQ = x + 1, ACK = y + 1——→
|
|
主机A
|
|
主机B
|
应用进程
释放连接
|
——————FIN, SEQ = x—————→
|
通知主机
应用进程
|
|
←——ACK, SEQ= y, ACK = x + 1———
|
确认
|
确认
|
——————SEQ=Y+1——————→
|
|
主机A——————主机B
|
|
————M1, M2———→
|
A发送M1和M2
|
←———ACK2, ACK3——
|
B确认M1和M2
|
————M3———→丢失
|
A发送M3但丢失了
|
————M4 —————→
|
A发送M4
|
←———ACK3————
|
B只能再次确认M2(因为M3没有收到)
|
————M5—————→
|
A发送M5
|
←———ACK3————
|
B发送第二个重复确认ACK3
|
————M6—————→
|
A发送M6
|
←———ACK3————
|
B发送第三个重复确认ACK3
|
————M3—————→
|
A收到了三个重复的确认ACK3,就立即重传M3,而不必等待超时重传。
|