TCP 3way handshake


# Connection Establishment
**TCP 3 Way Handshake는 TCP/IP프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에**
**먼저 ****정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미**

![](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Faa5ec72d-e126-4437-8809-9d80adf6e929%2FUntitled.png?table=block&id=37369b73-e1f6-4cee-95b6-815b62237e24&cache=v2)
- Client > Server : TCP SYN
- Server > Client : TCP SYN ACK
- Client > Server : TCP ACK
**[STEP 1]**
A클라이언트는 B서버에 접속을 요청하는 SYN 패킷을 보낸다. 이때 A클라이언트는 SYN 을 보내고 SYN/ACK 응답을 기다리는SYN_SENT 상태가 되는 것이다.
**[STEP 2]**
B서버는 SYN요청을 받고 A클라이언트에게 요청을 수락한다는 ACK 와 SYN flag 가 설정된 패킷을 발송하고 A가 다시 ACK으로 응답하기를 기다린다. 이때 B서버는 SYN_RECEIVED 상태가 된다.
**[STEP 3]**
A클라이언트는 B서버에게 ACK을 보내고 이후로부터는 연결이 이루어지고 데이터가 오가게 되는것이다. 이때의 B서버 상태가 ESTABLISHED 이다.
위와 같은 방식으로 통신하는것이 신뢰성 있는 연결을 맺어 준다는 TCP의 3 Way handshake 방식
클라이언트에서 서버에게 존재를 알리고 패킷을 보낼 수 있다는 것을 알리듯, 서버에서도 클라이언트에게 존재를 알리고 패킷을 보낼 수 있다는 신호를 보내야 한다. 그렇기 때문에 2-way-handshake로는 부족

TCP는 연결 지향 소켓으로 클라이언트와 서버가 연결되었는지 확인하는 과정이 존재한다. 그 확인하는 과정중에 하나의 방법이 3-Way Handshake
소켓(Socket)이란 서로 떨어져있는 두 컴퓨터를 소프트웨서 상으로 연결해 주기위한 프로그램
소켓이 어떤 통신을 하느냐에 따라서 소켓의 종류가 다양하게 존재하고, 그 종류중의 하나가 TCP소켓


![](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F0b821c4c-f599-4d52-bf99-4a072302e717%2FUntitled.png?table=block&id=6ae1d9f0-9194-4a75-b777-811bf89f7843&cache=v2)
**SYN(Synchronize) 연결을 요청하는 패킷**
**ACK(Acknowledge) 요청에 응답하는 패킷**
위의 패킷은 데이터가 없이 헤더만 존재하는 패킷이다. 단지 확인을 위한 최소한의 크기의 패킷
![](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F7f7fabfa-ec74-4975-9ab1-af97823a3bdb%2FUntitled.png?table=block&id=6c78c1f3-5416-4423-9d9d-e56c9df57ced&cache=v2)

**1. 클라이언트가 서버에게 SYN 패킷를 보낸다. (SYN 1000)**
**2. 그럼 서버에서 받았을 경우 클라이언트로 부터 받은 패킷에 1을 더한 수를 ACK 패킷으로 보낸다. (ACK 1001) 그리고 서버도 클라이언트에게 SYN 패킷을 보낸다. (SYN 2000) 즉 요청에 응답하는 패킷과 연결을 요청하는 패킷을 함께 보낸다.**
**3. 클라이언트가 정상적으로 서버의 SYN 패킷을 받았다면 그 패킷에 1을 더한 수를 서버에게 ACK 패킷으로 보낸다. (ACK 2001)**
연결이 확정된 상태를 **ESTABLISHED **상태
타임아웃값은 정확히 말하면 SYN 패킷을 보내고 ACK 패킷을 받기까지의 한계 시간
이 타임아웃 값의 크기는 네트워크의 성능에 큰 영향을 미친다. 이 시간이 너무 짧으면 느린 네트워크에서 정상적으로 서버에서 클라이언트가 응답했음에도 불구하고 다시 보내라는 재전송 요청
그래서 이 값은 정적인 값으로 설정하는 것이 아니라 동적으로 유연하게 하는 것이 바람
2way 안되는 이유는 양방향이라 server to client 검증 위해



> [[Network]3-Way Handshake](https://hyoje420.tistory.com/4)

> [[TCP] 3-way-handshake & 4-way-handshake](https://asfirstalways.tistory.com/356)






