Transmission Control Protocol (TCP) - Anadolu Üniversitesieem.anadolu.edu.tr/isan/EEM...

14
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 END systems – 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 data application reads data

Transcript of Transmission Control Protocol (TCP) - Anadolu Üniversitesieem.anadolu.edu.tr/isan/EEM...

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)