Upload
truonghuong
View
231
Download
4
Embed Size (px)
Citation preview
1
1
Transmission Control Protocol (TCP)
2
TCP: Overview RFCs: 793, 1122, 1323, 2018, 2581
reliable, in-order byte steam: no “message boundaries”
send & receive buffers buffer incoming & outgoing
data
flow controlled: sender will not overwhelm
receiver
congestion controlled: sender will not overwhelm
network
point-to-point (unicast): one sender, one receiver
connection-oriented: handshaking (exchange of
control msgs) init’s sender, receiver state before data exchange
State resides only at the ENDsystems – Not a virtual circuit!
full duplex data: bi-directional data flow in same
connection (A->B & B->A in the same connection)
MSS: maximum segment size
socket
door
TCP
send buffer
TCP
receive buffer
socket
door
segment
application
writes dataapplication
reads data
2
3
TCP segment structure
source port # dest port #
32 bits
applicationdata
(variable length)
sequence number
acknowledgement number
Receive window
Urg data pnterchecksum
FSRPAUheadlen
notused
Options (variable length)
URG: urgent data (generally not used)
ACK: ACK #valid
PSH: push data now(generally not used)
RST, SYN, FIN:connection estab(setup, teardown
commands)
# bytes rcvr willingto accept
countingby bytes of data(not segments!)
Internetchecksum
(as in UDP)
4
TCP Connection-oriented demux
TCP socket identified by 4-tuple: source IP address
source port number
dest IP address
dest port number
receiving host uses all four values to direct segment to appropriate socket
3
5
TCP Demultiplexing Example
ClientIP:B
P
clientIP: A
P1P
serverIP: C
SP: 80
DP: 9157
SP: 9157
DP: 80
SP: 80
DP: 5775
SP: 5775
DP: 80
P P
6
Connection Termination
Reliable, In-OrderData Exchange
Connection Establishment
Typical TCP TransactionClient Server
timetime
A TCP Transaction consists of 3 Phases1. Connection Establishment
Handshaking between client and server
2. Reliable, In-Order Data Exchange Recover any lost data
through retransmissions and ACKs
3. Connection Termination Closing the connection
4
7
TCP Connection Establishment
TCP sender, receiver establish “connection” before exchanging data segments
initialize TCP variables:
seq. #s
buffers, flow control info (e.g. RcvWindow)
client: connection initiatorSocket clientSocket = new Socket("hostname", port#);
server: contacted by clientSocket connectionSocket = welcomeSocket.accept();
8
Connection Establishment (cont)Host A Host B
time
Three-way handshake
Three way handshake:
Step 1: client host sends TCP SYN segment to server specifies a random initial
seq # no data
Step 2: server host receives SYN, replies with SYNACK segment
server allocates buffers specifies server initial
seq. #Step 3: client receives
SYNACK, replies with ACK segment, which may contain data
time
Connectionrequest
host ACKs and selects its own initial seq #
host ACKs
5
9
Connection Establishment (cont)Host A Host B
time
Three-way handshake
time
Connectionrequest
host ACKs and selects its own initial seq #
host ACKs
Seq. #’s: byte stream “number” of
first byte in segment’s data
ACKs: seq # of next byte
expected from other side cumulative ACK
10
TCP Starting Sequence Number Selection
Why a random starting sequence #? Why not simply choose 0? To protect against two incarnations of the same connection
reusing the same sequence numbers too soon
That is, while there is still a chance that a segment from an earlier incarnation of a connection will interfere with a later incarnation of the connection
How? Client machine seq #0, initiates connection to server with seq #0.
Client sends one byte and client machine crashes
Client reboots and initiates connection again
Server thinks new incarnation is the same as old connection
6
11
TCP Connection Termination
Closing a connection:
client closes socket:clientSocket.close();
Step 1: client end system sends TCP FIN control segment to server
Step 2: server receives FIN, replies with ACK. Server might send some buffered but not sent data before closing the connection. Server then sends FIN and moves to Closing state.
client server
close
Datawrite
closed
tim
ed w
ait
close
12
TCP Connection TerminationStep 3: client receives FIN, replies
with ACK.
Enters “timed wait” - will respond with ACK to received FINs
Step 4: server, receives ACK. Connection closed.
Why wait before closing the connection?
If the connection were allowed to move to CLOSED state, then another pair of application processes might come along and open the same connection (use the same port #s) and a delayed FIN from an earlier incarnation would terminate the connection.
client server
closing
closing
closed
tim
ed w
ait
closed
7
13
CLOSED
LISTEN
SYN_RCVD SYN_SENT
ESTABLISHED
CLOSE_WAIT
LAST_ACKCLOSING
TIME_WAIT
FIN_WAIT_2
FIN_WAIT_1
Passive open Close
Send/ SYN
SYN/SYN + ACK
SYN + ACK/ACK
SYN/SYN + ACK
ACK
Close /FIN
FIN/ACKClose /FIN
FIN/ACK
Timeout after two segment lifetimes
FIN/ACK
ACK
ACK
ACK
Close /FIN
Close
CLOSED
Active open /SYN
TCP State-Transition Diagram
14
Typical TCP Client/Server Transitions
TCP clientlifecycle
TCP serverlifecycle
8
15
How to program using the TCP?
TCP UDPIPLLPL
Socket Layer
TCP UDPIPLLPL
Socket LayerTCP UDP
IPLLPL
Socket Layer
Socket Layer: Programmer’s API to
the protocol stack
Typical network app has two pieces: client and server
Server: Passive entity. Provides service to clients
e.g., Web server responds with the requested Web page
Client: initiates contact with server (“speaks first”) typically requests service from server, e.g., Web Browser 16
Socket Creation
Family Type Protocol
TCPPF_INET
SOCK_STREAM IPPROTO_TCP
UDP SOCK_DGRAM IPPROTO_UDP
mySock = socket(family, type, protocol);
UDP/TCP/IP-specific sockets
Socket reference File (socket) descriptor in UNIX
Socket handle in WinSock
9
17
TCP Client/Server Interaction
Client
1. Create a TCP socket
2. Establish connection
3. Communicate
4. Close the connection
Server
1. Create a TCP socket
2. Assign a port to socket
3. Set socket to listen
4. Repeatedly:
a. Accept new connection
b. Communicate
c. Close the connection
Server starts by getting ready to receive client connections…
18
TCP Client/Server Interaction
Client
1. Create a TCP socket
2. Establish connection
3. Communicate
4. Close the connection
Server
1. Create a TCP socket
2. Bind socket to a port
3. Set socket to listen
4. Repeatedly:
a. Accept new connection
b. Communicate
c. Close the connection
/* Create socket for incoming connections */if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
DieWithError("socket() failed");
10
19
TCP Client/Server Interaction
Client
1. Create a TCP socket
2. Establish connection
3. Communicate
4. Close the connection
Server
1. Create a TCP socket
2. Bind socket to a port
3. Set socket to listen
4. Repeatedly:
a. Accept new connection
b. Communicate
c. Close the connection
echoServAddr.sin_family = AF_INET; /* Internet address family */echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);/* Any incoming interface */echoServAddr.sin_port = htons(echoServPort); /* Local port */
if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)DieWithError("bind() failed");
20
TCP Client/Server Interaction
Client
1. Create a TCP socket
2. Establish connection
3. Communicate
4. Close the connection
Server
1. Create a TCP socket
2. Bind socket to a port
3. Set socket to listen
4. Repeatedly:
a. Accept new connection
b. Communicate
c. Close the connection
/* Mark the socket so it will listen for incoming connections */if (listen(servSock, MAXPENDING) < 0)
DieWithError("listen() failed");
11
21
TCP Client/Server Interaction
Client
1. Create a TCP socket
2. Establish connection
3. Communicate
4. Close the connection
Server
1. Create a TCP socket
2. Bind socket to a port
3. Set socket to listen
4. Repeatedly:
a. Accept new connection
b. Communicate
c. Close the connection
for (;;) /* Run forever */{
clntLen = sizeof(echoClntAddr);
if ((clntSock=accept(servSock,(struct sockaddr *)&echoClntAddr,&clntLen)) < 0)DieWithError("accept() failed");
22
TCP Client/Server Interaction
Client
1. Create a TCP socket
2. Establish connection
3. Communicate
4. Close the connection
Server
1. Create a TCP socket
2. Bind socket to a port
3. Set socket to listen
4. Repeatedly:
a. Accept new connection
b. Communicate
c. Close the connection
Server is now blocked waiting for connection from a client
12
23
TCP Client/Server Interaction
Client
1. Create a TCP socket
2. Establish connection
3. Communicate
4. Close the connection
Server
1. Create a TCP socket
2. Bind socket to a port
3. Set socket to listen
4. Repeatedly:
a. Accept new connection
b. Communicate
c. Close the connection
Later, a client decides to talk to the server…
24
TCP Client/Server Interaction
Client
1. Create a TCP socket
2. Establish connection
3. Communicate
4. Close the connection
Server
1. Create a TCP socket
2. Bind socket to a port
3. Set socket to listen
4. Repeatedly:
a. Accept new connection
b. Communicate
c. Close the connection
/* Create a reliable, stream socket using TCP */if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
DieWithError("socket() failed");
13
25
TCP Client/Server Interaction
Client
1. Create a TCP socket
2. Establish connection
3. Communicate
4. Close the connection
Server
1. Create a TCP socket
2. Bind socket to a port
3. Set socket to listen
4. Repeatedly:
a. Accept new connection
b. Communicate
c. Close the connection
echoServAddr.sin_family = AF_INET; /* Internet address family */echoServAddr.sin_addr.s_addr = inet_addr(servIP); /* Server IP address */echoServAddr.sin_port = htons(echoServPort); /* Server port */
if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)DieWithError("connect() failed");
26
TCP Client/Server Interaction
Client
1. Create a TCP socket
2. Establish connection
3. Communicate
4. Close the connection
Server
1. Create a TCP socket
2. Bind socket to a port
3. Set socket to listen
4. Repeatedly:
a. Accept new connection
b. Communicate
c. Close the connection
echoStringLen = strlen(echoString); /* Determine input length */
/* Send the string to the server */if (send(sock, echoString, echoStringLen, 0) != echoStringLen)
DieWithError("send() sent a different number of bytes than expected");
14
27
TCP Client/Server Interaction
Client
1. Create a TCP socket
2. Establish connection
3. Communicate
4. Close the connection
Server
1. Create a TCP socket
2. Bind socket to a port
3. Set socket to listen
4. Repeatedly:
a. Accept new connection
b. Communicate
c. Close the connection
/* Receive message from client */if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0)
DieWithError("recv() failed");
28
TCP Client/Server Interaction
Client
1. Create a TCP socket
2. Establish connection
3. Communicate
4. Close the connection
Server
1. Create a TCP socket
2. Bind socket to a port
3. Set socket to listen
4. Repeatedly:
a. Accept new connection
b. Communicate
c. Close the connection
close(sock); close(clntSocket)