Upload
jonas-harvey
View
44
Download
2
Tags:
Embed Size (px)
DESCRIPTION
Phase 4: Network. For ACM05, By Mu LI. The Goal. Implement a full-duplex, reliable, byte-stream communication with no size limits. Write a chat-room program to test your codes. The network layer of nachos. IP Address LinkAddress Port Number Port Number - PowerPoint PPT Presentation
Citation preview
The Goal
• Implement a full-duplex, reliable, byte-stream communication with no size limits.
• Write a chat-room program to test your codes.
The network layer of nachos
• IP Address LinkAddress• Port Number Port Number• UDP Embedded in Machine.NetworkLink• UDP Packet Machine.Packet• TCP Embedded in the Network Package• TCP Packet Network.MailMessage• TCP Network Daemon Network.PostOffice• TCP Socket Tuple of (SrcLinkAddr,
DestLinkAddr, SrcPort, DestPort)
Codes provided
• machine.NetworkLink.java – provides ordered, unreliable, transmission of limits size packets between nodes
• machine.Packet.java – transmission unit
A sample format
• The control bit (FIN, …) take one bit, resp. and is in effect when 1• Blank is just for keeping regular
The states for socket
Name Description Duty
CLOSED 无连接 等待连接或者连接已结束SYN_SENT 已发送 SYN 等待 SYN/ACKSYN_RECVD 接受到 SYN 调用 accept()ESTABLISHED 全双工连接已建立 发送接受数据STP_SENT 已发送 STP 不过要将未发送完的数据发完STP_RECVD 接受到 STP 不再发送,不过可以接受CLOSING 发送 FIN 等待 FIN/ACK,连接结束
The Events Cause Transition Name Property Description
CONNECT 主动调用 程序调用 connect()ACCEPT 主动调用 程序调用 accept()RECV 主动调用 程序调用 read()SEND 主动调用 程序调用 write()CLOSE 主动调用 程序调用 close()TIMER 系统自动调用SYN 接受到数据 接受到 SYN包SYNACK 接受到数据 接受到 SYN/ACK包DATA 接受到数据 接受到 DATA包ACK 接受到数据 接受到 ACK包STP 接受到数据 接受到 STP包FIN 接受到数据 接受到 FIN包FINACK 接受到数据 接受到 FIN/ACK包
States Transition TableCur. State Event New State OperationCLOSED CONNECT SYN_SENT Send(SYN), block等待 SYN/ACK
RECV - 取数据出队,队为空时失败SYN SYN_RCVDFIN - Send(FINACK) (由于有可能 FINACK 丢
失)SYN_SENT TIMER - Send(SYN)
SYN - Deadlock! (双方都等待对方 SYN/ACK)
SYNACK ESTABLISHED
叫醒等待 connect()的线程
DATA, STP, FIN
- Send(SYN)
ESTABLISHED
RECV - 取数据出队SEND - 列数据入队,移动发送窗口CLOSE CLOSING
STP_SENT如果发送队列为空, send(FIN)否则 send(STP)
TIMER - 重新发送未收到回答的包SYN - Send(SYN/ACK)DATA - 列包入队, send(ACK)ACK - 转移发送窗口STP STP_RCVD 清空发送队列FIN CLOSED 清空发送队列, send(FIN/ACK)
Class: MailMessage
• 持有其所对应的 machine.Packet格式的对象packet
• 发送时使用 NetworkLink.send()发送 packet• 重载 hashcode()使得其与对应的 packet有相同的 hash,以便查找
Socket.Read()
• 从接收缓冲队列 receiveBuffer中读取字节,无等待的返回实际读到的字节数
• receiveBuffer中消息按照先后顺序存放至多16 个 MailMessage,顺序是 PostOffice保证的
Socket.Write()
• 将所需要写的字节分割打包成MailMessage• 列队入发送窗口队列 sendWindow• 当 sendWindow满了时,列队入发送缓冲队
列 sendBuffer
Class: PostOffice
• PostOffice类是实现状态转移的核心类,它管理所有的消息的发送与接受,维护所有的 socket状态
• 运行时候只有一个实例,内部维护 5条进程 :–处理中断的 receiveHandler 和 sendHandler–收发消息的 receiveThread 和 sendThread–定时启动发送消息的 timeoutThread
Class: NetProcess
• 主要任务是处理两个新的 sysvcall:– syscallConnect• 首先新建相应的 socket,将 socket加入进程的
descriptor table 和 PostOffice 的 socket table。然后维护 socket状态,发送 SYN,一直等待收到 SYN/ACK才返回
– syscallAccept• 取出 SYN,根据消息取出对应的 socket,将 socket放入进程的 descriptor table,维护 socket状态