TCP 프로토콜
하는 일
구조
TCP 플래그
종류
- 각각이 1 bit로 세팅되어 있는데, 0은 사용안하고, 1은 사용하는 것임..
- 한번에 하나만 세팅해서 보내는게 아니라 여러개도 가능하다.
기능
Urgent
- 긴급 bit
- 1로 세팅해서 보내면, 이 네트워크 패킷은 우선순위가 높은 거라 빠르게 처리해줬으면 좋겠다는 뜻.
- 그런데 요즘 별로 사용 안한다.
- 요즘 네트워크 상태가 엄청 빨라서..
Reset
- 초기화 bit
- 연결이 잘못되었을 때 연결을 초기화 시키기 위함.
Acknowledgement
Syn
Push
Fin
- 종료 bit
- 데이터를 잘 받았으면 연결을 끊기 위해 쓰는 플래그.
TCP를 이용한 통신과정
연결 수립 과정
-
TCP 통신을 위한 네트워크 연결은 3 way handshake 라는 방식으로 연결된다.
-
쉽게 이야기 하면, 서로의 통신을 위한 관문(port)을 확인하고 연결하기 위하여 3번의 요청/응답 후에 연결이 되는 것이다.
연결 수립을 하기 위한 통신 TCP 3Way Handshake
먼저 Server에서 열려있는 포트는 LISTEN 상태이고 Client에서는 Closed 상태이다.
-
Client에서 Server에 연결 요청을 하기위해 SYN 데이터를 보낸다.
Server에서 해당 포트는 LISTEN 상태에서 SYN 데이터를 받고 SYN_RCV로 상태가 변경된다.
-
그리고 요청을 정상적으로 받았다는 대답(ACK)와 Client도 포트를 열어달라는 SYN 을 같이 보낸다.
-
Client에서는 SYN+ACK 를 받고 ESTABLISHED로 상태를 변경하고 서버에 요청을 잘 받았다는 ACK 를 전송한다.
ACK를 받은 서버는 상태가 ESTABLSHED로 변경된다.
- 여기서 Sync와 Ack는 받고 보낼 때 1씩 증가시킨다.
- sync는 요청, ack는 응답이다.
- 그래서 클라이언트가 서버에 처음 요청할 때 sync는 100이다.
- 그거에 대한 응답인 ack는 요청 받은 sync인 100에 1을 더해서 ack로 101이 가는 것이다.
- 그리고 서버가 클라이언트에게 port를 알려달라고 새 요청을 보냈기에 새로운 sync인 2000으로 시작한다.
- 그거에 대한 대답을 클라이언트가 하면서 sync였던 2000이 ack 2001로 변경되는 것이다!
데이터 송수신 과정
HTTP나 FTP와 같은 각종 데이터를 포함한 통신
- 위에서 3handshake를 하고 난 후, 클라이언트가 다시 웹 서버로 요청을 보낸다.
- 아까 보냈던 번호 그대로 이어서 보낸다.
- push와 ack를 같이 해서 보내는데, 아까는 1씩 증가시키면서 동기화를 시켰는데, 그때는 데이터를 안보냈다.
- 그런데 이번엔 100바이트짜리 데이터를 보냈기 때문에 100이 증가한다.
- 그러면 이번엔 클라이언트가 서버에게 500바이트 짜리 데이터를 보낸다면?
- A가 500증가 한 채로 간다.
실습
- vm을 두개를 킨다.
- 한개는 Berryz Webshare 프로그램을 다운받아 켜준다.
- 나머지 하나는 client로서 wireshark를 켜준다.
- 그 후, 서버에 txt 파일을 하나 넣어주자.
- 서버의 ip와 port를 입력하면 위의 그림처럼 연결이 된다.
- 위의 그림과 같이 client 측에서 파일이 잘 보이는 것을 확인할 수 있다.
- client의 wireshark를 실행 시킨다.
- 위의 그림처럼 필터를 서버의 ip 주소로 걸어준다.
- 그 후, 아무 패킷이나 오른쪽 마우스를 클릭해 Follow -> TCP Stream 클릭
- 아래서 부터 부면 된다.
- 클라이언트가 처음 서버에게 Sync를 보낸다.
- 그러면 서버가 클라이언트에게 Sync와 Ack를 보낸다.
- 다시 클라이언트가 서버에게 Ack를 보낸다.
- 이로써 클라이언트와 서버가 연결이 되었다. 이것을 3 Hand Shacking이라고 한다.
-
위의 wireshark 메뉴에서 statistic의 Flow Graph를 누르고, Limit to Display filter를 클릭하면 위의 그림처럼 우리가 이론적으로 배운 내용들이 나온다.
-
서버와 클라이언트 연결을 위한 3 Hand Shacking을 한다.
-
그 이후, 데이터를 주고 받으며 서로 응답을 하는걸 볼 수 있다.
TCP 상태 전이도
TCP 연결 상태의 변화
- 실선은 클라이언트쪽 상태 변화
- 점선은 서버쪽 상태 변화
서버
- 서버는 항상 24시간 켜져 있어야 한다.
- 서버를 키게 되면 LISTEN 상태로 변경이 된다.
- 클라이언트 측에서 패킷을 보내면 서버는 SYN_RCVD 상태가 된다.
- 받았다고 응답을 클라이언트에 보내고, 클라이언트가 서버가 보낸 응답을 받았다고 보내면 서버는 ESTABLISHED 상태가 된다.
클라이언트
- 클라이언트 측에서 서버측에 패킷을 보내면 SYN_SENT 상태가 된다.
- 그 상태에서 서버 측에 SYN, ACK를 보내면서 ESTABLISHED 상태가 된다.
3 Way Handshake와 함께보기
- 클라이언트가 패킷 만들어서 보내면 SYN_SENT 상태
- 서버는 받으면 SYN_RECEIVED 상태가 되고, 응답을 만들어서 보낸다.
- 클라이언트는 받았을 때, 응답을 보냄과 동시에 ESTABLISHED 상태가 되고, 서버는 패킷을 받게 되면 ESTABLISHED 상태가 되는 것이다.
실습
- netstat -ano 를 이용해 서버가 켜져 있는지 보자
- 오른쪽을 보면 서버쪽이 LISTENING 상태로, 클라이언트와 연결될 준비가 되어있는걸 볼 수 있다.
서버
클라이언트
- 서버 입장에서는 클라이언트가 오른쪽에 와있고, 클라이언트 입장에서는 서버가 오른쪽으로 와있다.
- 그리고 ESTABLISHED로 되어있는데, 파일을 주고 받을 수 있는 상태라는 것이다.