본문 바로가기

Project

Project04 Socket 과 3 Way Handshake

.3Way Handshake
TCP 3 Way Handshake는 TCP/IP프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미합니다.이 과정에서 송신측과 수신측에 총 3개의 패킷이 생성이 되기 때문입니다

참고>>3way 4way? 뭐가 다른가?
예를 들어 악수를 합니다
3way의 경우 "악수합시다" 상대방에게 요청을 하여 "그래요 합시다"하여 의사를 결정후 손을 내밀어서 악수의 준비를 완료가 되면 악수가 이루어지는 방식이라고 볼 수 있습니다
4way의 경우 "악수합시다" 상대방에게 요청을 하면 "저말씀입니까?" "그래요 당신과 하고 싶습니다"하고 의사를 제차 확인한 후에 상대방이 "그래요 합시다"하고 손을 내밀어서 악수의 준비가 완료되면 악수가 이루어지는 방식입니다

.목표
TCP통신에서 socket으로 생성된 두 프로그램이 일련의 과정을 거쳐서 메세지를 주고 받고 종료될때까지 패킷의 내용을 분석하여 의미를 파악하는 것입니다

.준비단계 - test를 위해 3가지의 파일이 필요합니다
소켓설정은 socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) ;으로 동일합니다

1)client.c 
   socket() ->  connect() ->  메세지 수송신

2)server.c
   socket() ->   bind() ->  listen() -> accept() ->   메세지 수송신

3)packet analyzer.c 
   1계층 ethetnet -> 2계층 IP -> 3계층 TCP
   * 20회 정도를 실행하도록 for문을 걸었습니다
   * 1,2계층의 정보는 출력하지 않습니다 

참고>>고정 아이피 사용?
TCP를 테스트하기 위해서 내부 아이피주소(127.0.0.1)을 사용하면 패킷이 잡히지가 않습니다 그래서 고정아이피로 세팅해주고 자신의 컴퓨터에서 client server를 실행하면 않되고 2대의 서로 다른 컴퓨터에서 테스트를 해야 정상적으로 출력이 됩니다

.실행
server를 실행한후 packet과 client를 실행 하였습니다
15번 실행되면 TCP정보가 아래 그림과 같이 나타났습니다

./server

 

./packet analyzer



.패킷분석표 - 프로그램을 실행하여 나온 20개의 데이터 값을 정리하여 표로 만들었습니다

순서

Source

Destination

Seq Num

Ack Num

Fin

Syn

Ack

1

1682

49152

1100612098

1155894860

0

0

1

2

2169

3000

1306455164

0

0

1

0

3

3000

2169

1306455165

1036455165

0

1

1

4

3697

2869

1156146258

0

0

1

0

5

2869

3697

2068327811

115614259

0

1

1

6

2169

3000

1306455165

1307210305

0

0

1

7

2169

3000

1306455165

1307210305

0

0

1/psh

8

3000

2169

1307210305

1306455170

0

0

1/psh

9

3697

2869

1156146259

02068327812

0

0

1

10

3000

2169

1307210305

1306455170

0

0

1

11

3000

2169

1307210310

1306455170

1

0

1

12

2169

3000

1306455170

1307210310

0

0

1

13

3697

2169

1156146259

2068327812

0

0

1

14

2169

3000

1306455170

1307210311

1

0

1

15

3000

2169

1307210311

1306455171

0

0

1

 

참고>>
실행하던 시점(client 3000)의 server에서 다른 컴퓨처와 연결된 client(3697)가 있어서 표에서는 2가지의 값을 나타나고 있습니다

 

참고>>flag
SYN(Synchronization)
세션을 설정하는 데에 사용되며 초기에 시퀀스 번호를 보내게 된다. 시퀀스 번호는 임의적으로 생성하여 보낸다.

ACK(Acknowledgement)
받는 사람이 보낸 사람 시퀀스 번호에 TCP 계층에서 길이 또는 데이터 양을 더한 것과 같은 ACK를 보냅니다. ACK의 번호와 응답을 통해 보낸 패킷에 대한 손실을 판단하여 재전송 하거나 다음 패킷을 전송한다.

FIN(Finish)     
세션을 종료시키는 데에 사용되며 보낸 사람이 더이상 보낸 데이터가 없음을 보여준다.

RST(Reset)
재설정(Reset)을 하는 과정이며 양방향에서 동시에 일어나는 중단 작업이다. 비 정상적인 세션 연결 끊기에 해당한다.

PSH(Push)
대화형 트랙픽에 사용되는 것으로 버퍼가 채워지기를 기다리지 않고 데이터를 전달한다. 데이터는 버퍼링 없이 바로 위 Layer가 아닌 7 Layer의 응용프로그램으로 바로 전달한다.

.Handshake의 단계
1) 연결요청 단계 - 3way handshake



위의 패킷분석표에서 2,3,6에 해당합니다

2

2169

3000

1306455164

0

0

1

0

3

3000

2169

1306455165

1036455165

0

1

1


2 번에서는 비어있던 3000포트 향해서 채워지고 syn이1 이되었습니다
 여기는 "저와 악수를 하겠습니까"에 해당합니다

3 번에서는 3000포트에서 부터 syn1 ack1을 보냅니다
 여기는 "그래요 합시다"에 해당합니다

6

2169

3000

1306455165

1307210305

0

0

1


6번에서는 3000포트를 향해서 ack1을 다시 보냅니다
 손을 내밀며 연결 요청이 되었음을 가리킵니다 

2) 연결종료 단계 - 4way handshake


위의 패킷분석표에서 11,12,14,15에 해당합니다

11

3000

2169

1307210310

1306455170

1

0

1

12

2169

3000

1306455170

1307210310

0

0

1

11번에서 fin 1 ack 1을 보내어 종료를 하겠다는 의사를 밝힙니다
12번에서 일단 1번 생각하고

14

2169

3000

1306455170

1307210311

1

0

1

15

3000

2169

1307210311

1306455171

0

0

1

14번에서 fin 1 ack 1을 보내서 확실한 결정을 내립니다
15번에서 종료메세지 처리를 완료하게됩니다

문제점>>ack 카운트
11 12번의 데이터를 보면 akc가 카운트 되지 않고 있습니다 분석해본 결과로는 fin 으로 받은 다음 2번을 보낸 후에 최종결과를 보내기 때문에 받아 들이는 입장에서는 14번이 되어야지만 데이터를 처리 할 수 있습니다 그래서 14번부터 ack 가num에 카운트 됩니다 

참고>>데이터 전달 psh

7

2169

3000

1306455165

1307210305

0

0

1/psh

8

3000

2169

1307210305

1306455170

0

0

1/psh


7번과 8번에서는 psh(push)가 1세팅되었습니다 이것은 상위 응용프로그램 단계에 데이터가 쓰여졌다는 의미입니다 즉 read write로 데이터를 주고 받았다는 것을 알수 있습니다