pptx - Dongsu Han
Download
Report
Transcript pptx - Dongsu Han
NETWORK PROGRAMMING
INTRO TO DISTRIBUTED SYSTEMS
FALL 2013
Some material taken from publicly available lecture slides
including Srini Seshan’s and David Anderson’s
Dongsu Han
L3-socket
Today’s Lecture
Lecture
Transport
protocols: UDP and TCP
Version control using SVN
TA-led programming session
Editor,
socket programming
Debugging with gdb
Announcement
Programming
Assignment 1 is out. (Due in two weeks--추석)
Review of Previous Lectures
What is a distributed system? (L1)
Definition
Example
What are some of the important decisions made in the Internet
architecture? (L2)
Narrow
Why?:
waist: Network provides minimal functionality (best-effort)
to connect existing networks that are heterogeneous
Stateless
architecture: no per-flow state inside network
Why?
For
survivability
Transport Protocols
Lowest level end-to-end protocol.
Header generated by sender is interpreted
only by the destination
Routers view transport header as part of the
payload; they are not supposed to see the
transport header.
7
7
6
6
5
5
Transport
Transport
IP
IP
IP
Datalink
2
2
Datalink
Physical
1
1
Physical
router
4
What does the transport layer do?
No per-flow (connection) state in the network
Transport
layer maintains the connection state. Transport layer identifies an
end-to-end connection.
How does the transport layer identify an end-point (application)?
De-multiplexing: Port numbers
Network layer gets you to the host.
A port identifies the sending or receiving socket (application).
A socket is one endpoint of a two-way communication between two
programs running on the network. A socket is bound to a port number
so that the transport layer can identify the application that data is
destined to be sent.
Identifying two end-points: An endpoint = <IP address, Port #>
Source endpoint = <SrcIPAddr, SrcPort>
destination endponit = <DestIPAddr, DestPort>
Protocol and Port Demultiplexing
7
Multiple choices at each layer
Applications open a socket (identified by the port number)
Port 80
Port 22 Port 80 Port 22
TCP
UDP
Network
IP
TCP/UDP
IP
NET1
NET2
…
NETn
Type Field
=IP
Protocol Field Port Number
= TCP
= 80
Server and Client
Server and Client exchange messages over the
network through a common Socket API
Clients
Server
TCP/UDP
user
space
ports
Socket API
TCP/UDP
IP
IP
Ethernet Adapter
Ethernet Adapter
8
kernel
space
hardware
Transport protocols
UDP
Provides
only integrity and de-multiplexing
TCP adds…
UDP: User Datagram Protocol [RFC 768]
10
“No frills,” “bare bones” Internet transport
protocol, “Best effort” service
UDP segments may be:
Lost, duplicated (bug, spurious retransmission at L2)
Delivered out of order to app
Connectionless:
No handshaking between UDP sender, receiver
Each UDP segment handled independently
Why is there a UDP?
• No connection establishment
(which can add delay)
• Simple: no connection state
at sender, receiver
• Small header
• No congestion control: UDP
can blast away as fast as de
sired
UDP, cont.
11
Often used for streaming mu
ltimedia apps (e.g., Skype)
Loss
tolerant
Rate sensitive
Other UDP uses (why?):
Length, in
bytes of UDP
segment,
including
header
32 bits
Source port #
Dest port #
Length
Checksum
DNS
Reliable transfer over UDP
Must
be at application layer
Application-specific error rec
overy
Application
data
(message)
UDP segment format
Transport protocols
UDP
Provides
only integrity and de-multiplexing
TCP adds…
Connection-oriented
Reliable
(error control)
Ordered byte stream (in-order delivery)
Bi-directional byte-stream
Flow and congestion controlled
TCP
Protocol implemented entirely at the ends
Fate
sharing
Abstraction provided
Connection
oriented protocol (hand-shake or connection establishment)
In-order byte-stream
Implemented functionality (next lecture)
Flow
control
Reliability (error control)
Reassembly (in-order delivery)
Congestion control
Difference in abstraction
UDP
Recv(len)
call gives you a packet (the payload part)
len
len
UDP segment (packet)
UDP segment (packet)
TCP
establishment (hand-shake) Will see in the TA led session.
Application
Recv(len) call give you a sequence of bytes
send()
Connection
len
Application
Recv()
len
Byte stream
Byte stream
Incoming stream
TCP– What goes on underneath
Byte stream
Packet (1~7)
Packet (8~10)
Packet (9~11)
Receive buffer
Packet (8~10)
I need seq# 8.
User Datagram Protocol(UDP):
An Analogy
UDP
Postal Mail
Single socket to receive messages
No guarantee of delivery
Not necessarily in-order delivery
Datagram – independent packets
Must address each packet
Single mailbox to receive letters
Unreliable
Not necessarily in-order delivery
Letters sent independently
Must address each reply
Example UDP applications
Multimedia, voice over IP
16
Transmission Control Protocol
(TCP): An Analogy
Telephone Call
TCP
Reliable – guarantee delivery
Byte stream – in-order delivery
Connection-oriented – single socket per
connection
Setup connection followed by data
transfer
Guaranteed delivery
In-order delivery
Connection-oriented
Setup connection followed by
conversation
Example TCP applications
Web, Email, Telnet
REVISION CONTROL & MAKE
Overview
Revision control systems
Motivation
Features
Subversion
primer
Make
Simple
gcc
Make basics and variables
Testing
Useful Unix commands
Dealing with large codebases
Complications
Code
synchronization
Backups
Concurrent modifications
Solution: Revision Control System (RCS)
Store
all of your code in a repository on a server
Metadata to track changes, revisions, etc…
Also useful for writing books, papers, etc…
Basic RCS features (1/2)
Infinite undo
go
Automatic backups
all
back to previous revisions
your code ever, forever saved
Changes tracking
see
differences between revisions
Basic RCS features (2/2)
Concurrency
Multiple
Snapshots
Save
people working at the same time
stable versions on the side (i.e. handin)
Branching
Create
diverging code paths for experimentation
Typical RCS workflow
1.
2.
3.
4.
5.
6.
Create repository on RCS server
Checkout the repository to your local machine
Work locally: create, delete and modify files
Update the repository to check for changes other people might ha
ve made
Resolve any existing conflicts
Commit your changes to the repository
RCS implementations
Revision Control System (RCS)
Concurrent Versions System (CVS)
Early system, no concurrency or conflict resolution
Concurrency, versioning of single files
Subversion (SVN)
File and directory moving and renaming, atomic commits
Concurrent edits (1/2)
Carnegie
File v1
Mellon
Both check out file
Edits (lines 30-40)
Edits (lines 1-20)
commit
File v2
Update
Merged automatically!
Concurrent edits (2/2)
Carnegie
File v1
Mellon
Both check out file
Edits (lines 10-20)
Edits (lines 1-20)
commit
File v2
Update
Conflict needing manual inte
rvention!
Resolving conflicts
When changes can’t be merged automatically
SVN gives you 3 files:
file.mine : your file
file.rx : the remote file
file : original file with marked conflicts
You can
Discard your changes
Discard others’ changes
Go over each conflict and arbitrate as appropriate
Interacting with SVN
Command line
Readily available in andrew machines
Graphical tools
Easier to use
Subclipse for Eclipse gives IDE/SVN integration
tortoiseSVN
실습 server
IP: 143.248.141.52 ~ 143.248.141.59 (8대)
ID: your student id (e.g., 20110111)
Password: ee324EE#@$
Svn password
20060584 28482
20071122 6534
20081275 51085
20090058 50346
20090276 54586
20100120 23860
20100137 29297
20100441 17889
20100827 30690
20100967 7532
20110343 4967
20110456 9139
20110773 8574
20111047 36671
Command line SVN example (1/2)
$ svn co –-username=“<<student id>>” https://ina.kaist.ac.kr/svn/
test
$ cd test/trunk
$ vim <<student id>>.txt
$ vim <<student id>>.
$ svn add <<student id>>.txt
$ svn commit -m 'adding a text file with my student id‘
$ svn update
$ cd ../
$ svn cp trunk tags/<<student id>>_submission
$ svn commit -m 'making a tag of the trunk for submission!‘
$ echo -e ”<<student id>>" >> student.txt
$ svn commit –m “added my student id”
Command line SVN example (2/2)
Revision control lets you note (and then see) what you changed:
> svn log student.txt
r986 | ntolia | 2006-08-01 17:13:38 -0400 (Tue, 01 Aug 2006) | 6 lines
This allows the sp to get rid of chunks early before a transfer is complete.
Useful when a file is requested in-order and the file size > mem cache size
> svn diff -r 1:2 student.txt
Index: file
===================================================================
--- file (revision 1)
+++ file (revision 2)
@@-1,2+1,3@@
This isatestfile
-It startedwithtwolines
+It nolongerhastwolines
+it hasthree
General SVN tips
Update, make, test, only then commit
Merge often (svn up)
Comment commits
Avoid commit races
Modular design avoids conflicts
Know more
subversion.tigris.org for SVN software & info
svnbook.red-bean.com for SVN book
Makefile
You are on your own.
Make
Utility for executable building automation
Saves you time and frustration
Helps you test more and better
Simple gcc
If we have files:
• prog.c: The main program file
• lib.c: Library .c file
• lib.h: Library header file
% gcc -c prog.c -o prog.o
% gcc -c lib.c -o lib.o
% gcc lib.o prog.o -o binary
gcc flags
• Useful flags
1. -g: debugging hook
2. -Wall: show all warnings
3. -Werror: treat warning as errors
4. -O0, -O1, -O2, -O3: optimization level
5. -DDEBUG: macro for DEBUG (#define DEBUG)
• Avoid using dangerous optimizations that could affe
ct correctness
More gcc
% gcc -g -Wall -Werror -c prog.c -o prog.o
% gcc -g -Wall -Werror -c lib.c -o lib.o
% gcc -g -Wall -Werror lib.o prog.o -o binary
This gets boring, fast!
Makefile basics
• Build targets
target: dependency1 dependency2 ...
unix command (start line with TAB)
unix command
Makefile example
binary: lib.o prog.o
gcc -g -Wall lib.o prog.o -o binary
lib.o: lib.c
gcc -g -Wall -c lib.c -o lib.o
prog.o: prog.c
gcc -g -Wall -c prog.c -o prog.o
clean:
rm *.o binary
Makefile variables (1/7)
• Variables
CC = gcc
CFLAGS = -g -Wall -Werror
OUTPUT = binary
Makefile variables (2/7)
binary: lib.o prog.o
gcc -g -Wall lib.o prog.o -o binary
lib.o: lib.c
gcc -g -Wall -c lib.c -o lib.o
prog.o: prog.c
gcc -g -Wall -c prog.c -o prog.o
clean:
rm *.o binary
Makefile variables (3/7)
CC = gcc
CFLAGS = -g -Wall
OUTPUT = binary
$(OUTPUT): lib.o prog.o
$(CC) $(CFLAGS) lib.o prog.o -o binary
lib.o: lib.c
$(CC) $(CFLAGS) -c lib.c -o lib.o
prog.o: prog.c
$(CC) $(CFLAGS) -c prog.c -o prog.o
clean:
rm *.o $(OUTPUT)
Makefile variables (4/7)
CC = gcc
CFLAGS = -g -Wall
OUTPUT = binary
$(OUTPUT): lib.o prog.o
$(CC) $(CFLAGS) lib.o prog.o -o binary
lib.o: lib.c
$(CC) $(CFLAGS) -c lib.c -o lib.o
prog.o: prog.c
$(CC) $(CFLAGS) -c prog.c -o prog.o
clean:
rm *.o $(OUTPUT)
Makefile variables (5/7)
CC = gcc
CFLAGS = -g -Wall
OUTPUT = binary
OBJFILES = lib.o prog.o
$(OUTPUT): $(OBJFILES)
$(CC) $(CFLAGS) $(OBJFILES) -o binary
lib.o: lib.c
$(CC) $(CFLAGS) -c lib.c -o lib.o
prog.o: prog.c
$(CC) $(CFLAGS) -c prog.c -o prog.o
clean:
rm *.o $(OUTPUT)
Makefile variables (6/7)
CC = gcc
CFLAGS = -g -Wall
OUTPUT = binary
OBJFILES = lib.o prog.o
$(OUTPUT): $(OBJFILES)
$(CC) $(CFLAGS) $(OBJFILES) -o binary
lib.o: lib.c
$(CC) $(CFLAGS) -c lib.c -o lib.o
prog.o: prog.c
$(CC) $(CFLAGS) -c prog.c -o prog.o
clean:
rm *.o $(OUTPUT)
Makefile variables (7/7)
CC = gcc
CFLAGS = -g -Wall
OUTPUT = binary
OBJFILES = lib.o prog.o
$(OUTPUT): $(OBJFILES)
$(CC) $(CFLAGS) $(OBJFILES) -o binary
%.o: %.c
# $<: dependency (%.c)
# $@: target (%.o)
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm *.o $(OUTPUT)
Simple Test Script (1/2)
% ./server 6667 &
% cat testfile.01 | ./testscript.py
% cat testfile.02 | ./testscript.py
% killall -9 server
Simple Test Script (2/2)
#/bin/sh
echo “Starting server on port 6667.”
./server 6667 &
SERVERPID = $!
echo “Running test files.”
cat testfile.01 | ./testscript.py
cat testfile.02 | ./testscript.py
echo “Killing server process.”
kill $(SERVERPID)
Augmenting the Makefile for testing (1/2)
CC = gcc
CFLAGS = -g -Wall
OUTPUT = binary
OBJFILES = lib.o prog.o
all: $(OUTPUT)
$(OUTPUT): $(OBJFILES)
$(CC) $(CFLAGS) $(OBJFILES) -o binary
%.o: %.c
# $<: dependencies (%.c)
# $@: target (%.o)
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm *.o $(OUTPUT)
Augmenting the Makefile for testing (2/2)
CC = gcc
CFLAGS = -g -Wall
OUTPUT = binary
OBJFILES = lib.o prog.o
all: $(OUTPUT)
test
$(OUTPUT): $(OBJFILES)
$(CC) $(CFLAGS) $(OBJFILES) -o binary
%.o: %.c
# $<: dependencies (%.c)
# $@: target (%.o)
$(CC) $(CFLAGS) -c $< -o $@
test: $(OUTPUT)
sh ./testscript.sh
clean:
rm *.o $(OUTPUT)
Using the Makefile
% make
% make test
% make clean
• Know more
Google
– “makefile example”
– “makefile template”
– “make tutorial”
– Chapter 3 of Dave Andersen’s notes
Extra: useful Unix commands (1/2)
• find “func_name” in files
% grep -r func_name .
• replace “bad_func_name” to “good_func_n
ame”
% sed -e “s/bad_func_name/good_func_name/g”\
prog.c > prog.c.new
Extra: useful Unix commands (2/2)
• find a file named “prog.c”
% find -name prog.c
• download files from the Internet
% wget http://address/to/file.tar.gz
• untar and unzip a file
% tar xzvf file.tar.gz
Assignment
You have access to svn repository at
https://ina.kaist.ac.kr/svn/<student id>
However, we will change your password (to some unknown integer).
Luckily, we made a server that gives you a hint.
When your client asks whether the username and the password match,
the server can tell you whether the password provided is less than,
equal to, or greater than your real password.
Assignment I
Protocol is defined in the document. (See course web page).
Query
Server (provided by the instructor)
Client
Response
Part I: Assume the network is reliable. (due 9/23)
Part II: The server may drop a packet. (due 9/27)