이 5가지 계층중에서 전송계층은 응용층에 서비스를 제공하는 책임이 있다.
이때 사용되는 프로토콜이 바로 tcp와 udp이다. 3-way-handshake를 알아보는 시간이므로 tcp에 대해서만 간략하게 알아보자!
위와 같이 SCTP, TCP, UDP 세개의 프로토콜을 확인할 수 있다.
SCTP
TCP
UDP
tcp는 연결지향 프로토콜이다. 따라서 A에서 B사이트 사이의 데이터를 전송하면
2개의 TCP는 두 사이트 사이에 연결을 설정한다.
양 방향으로 데이터를 교환한다.
연결이 종료된다.
위와 같은 과정으로 진행이 된다. 하지만 이는 물리적 연결이 아니라 가상으로 된 연결이다.
따라서 TCP 세그먼트는 IP데이터그램으로 캡슐화되고, 순서가 뒤바뀌는 경우와 손실 또는 훼손되어 전달될수 있으며 이럴 경우 재전송된다.
세그먼트들은 다른 경로를 사용할 수 있지만 바이트들을 순서대로 전달하는 책임이 있는 스트림 지향환경을 만든다.
우선 TCP 세그먼트 형식을 보자
위는 실제 세그먼트 형식이다. 세그먼트는 손실되고 손상되었다면 TCP는 잃어버린 세그먼트가 도착할 때까지 세그먼트를 유지한다.(IP는 이 사실을 모른다.)
여기서 중요한것은 순서번호와 ack이다.
순서번호
ACK
TCP는 전이중 모드로 데이터를 전송한다. 따라서 2개의 시스템에 있는 2개의 TCP들이 연결될 때 동시에 서로 세그먼트를 송신할 수 있다.
이것은 양쪽이 각각 통신을 초기화해야하고, 데이터를 전송하기 전에 다른 쪽으로부터 승인을 얻어야 한다는것을 의미한다.
클라이언트가 서버와 연결을 만들기를 원한다고 가정하자!
서버
우선, 서버가 먼저 TCP에 연결을 받아들일 준비가 되었다고 알린다. 이것을 수동개방요청이라고 한다.
서버 TCP는 세상에 있는 어떠한 컴퓨터로부터도 연결을 받아들일 준비가 되어있지만 스스로 연결을 유지할 수 없다.
클라이언트
이때 3-way-handshake절차를 시작한다.
클라이언트는 SYN 플래그만 설정되어있는 첫 번째 세그먼트인 SYN세그먼트를 전송한다.
2개의 플래그 비트가 설정된 두 번째 세그먼트인 SYN + ACK 세그먼트를 전송한다.
이 세그먼트는 이중의 목적을 가지고 있다.
데이터를 운반하지 않는다.
클라이언트가 세번째 세그먼트를 전송한다.
MSS (Max Segment Size)인데, 이것은 TCP가 한번에 보낼 수 있는 최대의 데이터 량을 의미한다.
5000byte 파일을 전송하는 경우 MSS가 100byte라면, 50개의 세그먼트를 생성해야한다.
이때 TCP는 각 세그먼트의 sequence NumberField에 Byte기준 번호를 붙인다. ex) 첫번쨰가 0이라면 두번째는 100, 세번쨰는 200 이다.
ack번호는 다음데이터의 sequencenumber이기 때문에 첫번째 세그먼트를 보냈다면 수신자는 0~99번까지의 데이터는 잘 도착했기 때문에 99+1인 100의 번호로 응답한다.
수신자 측에서는 0~99까지의 sequence number와 200~299까지의 세그먼트를 받았다면 중간 데이터를 받지 못했다. 따라서 ack number 100으로 응답할 수 있다. 이러면 발신측에서는 재전송할 수 있다.