18
Phase 4: Network For ACM05, By Mu LI

Phase 4: Network

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

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• 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)

A Graphic Example

Provided

Codes provided

• machine.NetworkLink.java – provides ordered, unreliable, transmission of limits size packets between nodes

• machine.Packet.java – transmission unit

Your work

• Define the message formats over Packet.java• Design a socket states transition table

A sample format

• The control bit (FIN, …) take one bit, resp. and is in effect when 1• Blank is just for keeping regular

Message Types

• The message is the type iff all correspond control bits are 1 and the others are 0

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,以便查找

Class: Socket

• Socket类保存一个端对端的全双工通讯的信息

• Socket类继承自 machine.Openfile

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状态

Thank you

• Q & A